在几乎所有示例中,ML 类型语言中的 y-combinator 都是这样编写的:
let rec y f x = f (y f) x
let factorial = y (fun f -> function 0 -> 1 | n -> n * f(n - 1))
这可以按预期工作,但是使用let rec ...
.
我想在不使用递归的情况下定义这个组合器,使用标准定义:
Y = λf·(λx·f (x x)) (λx·f (x x))
直接翻译如下:
let y = fun f -> (fun x -> f (x x)) (fun x -> f (x x));;
但是,F# 抱怨它无法确定类型:
let y = fun f -> (fun x -> f (x x)) (fun x -> f (x x));;
--------------------------------^
C:\Users\Juliet\AppData\Local\Temp\stdin(6,33): error FS0001: Type mismatch. Expecting a
'a
but given a
'a -> 'b
The resulting type would be infinite when unifying ''a' and ''a -> 'b'
如何在不使用的情况下在 F# 中编写 y 组合器let rec ...
?