Почти во всех примерах, y-combinator в языках ML-типа записывается следующим образом:
let rec y f x = f (y f) x
let factorial = y (fun f -> function 0 -> 1 | n -> n * f(n - 1))
Это работает так, как ожидалось, но он чувствует, что обманывает определение y-combinator с помощью 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'
Как написать y-combinator в F # без использования let rec ...
?