Esa pregunta me parece curiosa e interesante. Por lo tanto, estoy tratando de averiguar qué es el cálculo lambda, encontrar una respuesta y quiero mostrarlo a OP (todas las pistas ya se han mostrado en realidad, alerta de spoiler).
En primer lugar, vamos a tratar de redefinir f
:
λ> let f = (\g x y z -> x^3 - g(x + g(y - g z) + g(z^2)))
f ::
(Integer -> Integer) -> Integer -> Integer -> Integer -> Integer
función Por lo tanto, tenemos que conseguir los números de función y 3 y devolver la respuesta. Usando curring podemos añadir g
definición aquí, al igual que f_new = f g
:
λ> let f = (\g x y z -> x^3 - g(x + g(y - g z) + g(z^2))) (\x -> 2*x^2 + 10*x + 1)
f :: Integer -> Integer -> Integer -> Integer
Hemos terminado. Vamos a comprobarlo:
λ> f 0 0 0
-13
La respuesta es correcta.
UPD:
En esos ejemplos let
es sólo una forma de declarar la función en el intérprete, de modo respuesta final es:.
f :: Num a => a -> a -> a -> a
f = (\g x y z -> x^3 - g(x + g(y - g z) + g(z^2))) (\x -> 2*x^2 + 10*x + 1)
'f = flip flip ((1 +) ap ((+). (2 *). (^ 2)) (10 *)). (dar la vuelta .) . ap ((.). (.). (.). (-). (^ 3)) (((ap id.).). flip flip (flip id. (^ 2)). (liftM2 (liftM2 (+)).). (. ((ap id.). (. flip id). (.). (-))). (.). (.). (+)) ': f hecho inútil por lambdabot – fuz