2

这不起作用:

let rec fix f = f (fix f)

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

let rec fix f x = f (fix f) x

lazy有没有办法使用and来做到这一点Lazy.force

4

1 回答 1

6

您的原件fix需要'a -> 'a

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

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

如果你让它采取一个Lazy<'a> -> 'a然后你可以写这个:

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

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

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

例如这里的阶乘函数:

> fix (fun f n -> if n > 1 then n * f.Value (n-1) else 1) 4;;
val it : int = 24
于 2014-02-08T13:04:55.927 回答