这不起作用:
let rec fix f = f (fix f)
解决方案是添加一个额外的参数:
let rec fix f x = f (fix f) x
lazy
有没有办法使用and来做到这一点Lazy.force
?
这不起作用:
let rec fix f = f (fix f)
解决方案是添加一个额外的参数:
let rec fix f x = f (fix f) x
lazy
有没有办法使用and来做到这一点Lazy.force
?
您的原件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