F# F中的不动点组合子#

F# F中的不动点组合子#,f#,fixpoint-combinators,F#,Fixpoint Combinators,这是行不通的: let rec fix f = f (fix f) 解决方案是添加一个额外的参数: let rec fix f x = f (fix f) x 有没有办法用lazy和lazy.force来实现这一点?您原来的修复程序将采用'a->'a: > let rec fix f = f (fix f);; val fix : ('a -> 'a) -> 'a 如果你让它变得懒惰 > let rec fix f = lazy f (fix f);; val

这是行不通的:

let rec fix f = f (fix f)
解决方案是添加一个额外的参数:

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

有没有办法用
lazy
lazy.force
来实现这一点?

您原来的
修复程序将采用
'a->'a

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

val fix : ('a -> 'a) -> 'a
如果你让它变得懒惰
> let rec fix f = lazy f (fix f);;

val fix : (Lazy<'a> -> 'a) -> Lazy<'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