Intento un ejemplo ficticio de usar composición con expresión lambda. El siguiente código se compila, pero no se ejecuta cuando intento (fg) 3 2
fx = x^2 gx = 5*x fg = \x -> f(gx)Da tal error:
Ambiguous occurrence `.' It could refer to either `Prelude..', imported from `Prelude' at list3.hs:1:1 (and originally defined in `GHC.Base') or `Main..', defined at list3.hs:42:3.¿Puede alguien decirme dónde está el problema?
Ha definido un operador de composición que existe junto con el importado de Prelude. No hay nada malo con la definición ; el problema ocurre cuando intenta usarlo , ya que el compilador no puede decir si algo como
main = print $ f . g $ 10 se supone que debe usar . del Preludio o . desde su módulo Main .
Una solución es simplemente ser explícito sobre cuál de los dos quieres.
f . g = \x -> f (gx) main = print $ f Main.. g $ 10o no importar la versión de Prelude en primer lugar.
{-# LANGUAGE NoImplicitPrelude #-} import Prelude hiding ((.)) -- Now this is the *only* definition. f . g = \x -> f (gx) main = print $ f . g $ 10Como se explica en la excelente respuesta de Chepner, su '.' El operador punto está en conflicto con el '.' normal. operador implícitamente importado de Haskell Prelude. Esto es lo que significa el mensaje de error.
Afortunadamente, el conjunto de caracteres Unicode es compatible con el compilador Haskell, y ofrece el carácter de composición de funciones adecuado como se ve en los libros de matemáticas, es decir, '∘', en la posición decimal 8728.
Y este operador '∘' NO está (todavía) definido por el Preludio.
Por lo tanto, el siguiente código funciona bien:
main :: IO () main = do let -- our own function composition operator: fna ∘ fnb = \x -> fna (fnb x) -- Unicode character #8728 (decimal) fx = x * x gx = 5 * x h = f ∘ g -- composed function res = h 7 putStrLn $ "res = " ++ (show res)e imprime un resultado de 1225, como era de esperar.