F#中的定点组合器

The*_*nce 2 f# fixpoint-combinators

这不起作用:

let rec fix f = f (fix f)
Run Code Online (Sandbox Code Playgroud)

解决方案是添加一个额外的参数:

let rec fix f x = f (fix f) x
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点使用lazyLazy.force呢?

GS *_*ica 5

你的原件fix需要'a -> 'a:

> let rec fix f = f (fix f);;

val fix : ('a -> 'a) -> 'a
Run Code Online (Sandbox Code Playgroud)

如果你需要一个,Lazy<'a> -> 'a那么你可以写这个:

> let rec fix f = lazy f (fix f);;

val fix : (Lazy<'a> -> 'a) -> Lazy<'a>
Run Code Online (Sandbox Code Playgroud)

f如果它不需要它,则允许不评估其参数,因此递归可以在运行时终止.

如果您希望结果为类型,'a则只需强制执行最终结果:

> let rec fix' f = lazy f (fix' f);;

val fix' : (Lazy<'a> -> 'a) -> Lazy<'a>

> let fix f = (fix' f).Value;;

val fix : (Lazy<'a> -> 'a) -> 'a
Run Code Online (Sandbox Code Playgroud)

例如,这里是阶乘函数:

> fix (fun f n -> if n > 1 then n * f.Value (n-1) else 1) 4;;
val it : int = 24
Run Code Online (Sandbox Code Playgroud)