En casi todos los ejemplos, un Y-Combinator en lenguajes de tipo ML se escribe así:¿Cómo puedo definir y-combinator sin "let rec"?
let rec y f x = f (y f) x
let factorial = y (fun f -> function 0 -> 1 | n -> n * f(n - 1))
Esto funciona como se esperaba, pero se siente como hacer trampa para definir la ordenada en el combinador usando let rec ...
.
quiero definir este combinador sin utilizar la recursividad, usando la definición estándar:
Y = λf·(λx·f (x x)) (λx·f (x x))
una traducción directa es la siguiente:
let y = fun f -> (fun x -> f (x x)) (fun x -> f (x x));;
Sin embargo, F # se queja de que no puede entender los tipos:
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'
¿Cómo wRIT e el combinador y en F # sin usar let rec ...
?
* ¡Pero Julieta! Tu y-combinator funciona bien tal como está escrito, ¿por qué te preocupa que esté escrito con 'let rec'? * Solo porque. O realmente, solo para ver cómo se hace, no porque lo necesite. Otro usuario de SO me preguntó cómo se escribe sin 'let rec', y no pude resolverlo de inmediato. – Juliet