haskell - programa - ¿Qué está pasando con los tipos en esta sesión de ghci?
programa en haskell (1)
Estoy aprendiendo Haskell, y estaba jugando en ghci cuando encontré algo muy desconcertante.
Primero, crea una simple función de agregar:
Prelude> let add x y = x + y
Tenga en cuenta que funciona con ints y flotadores:
Prelude> add 3 4
7
Prelude> add 2.5 1.3
3.8
Ahora crea una función de aplicación. Es idéntico a $
(pero no infijo). Funciona como un no-op en agregar:
Prelude> let apply f x = f x
Prelude> apply add 3 4
7
Prelude> apply add 2.5 1.3
3.8
Ok, ahora haga add''
que es lo mismo que add''
pero usando apply
:
Prelude> let add'' = apply add
Prelude> add'' 3 4
7
Prelude> add'' 2.5 1.3
<interactive>:1:9:
No instance for (Fractional Integer)
arising from the literal `1.3'' at <interactive>:1:9-11
Possible fix: add an instance declaration for (Fractional Integer)
In the second argument of `add'''', namely `1.3''
In the expression: add'' 2.5 1.3
In the definition of `it'': it = add'' 2.5 1.3
Wat.
Aquí están los tipos:
Prelude> :t add
add :: (Num a) => a -> a -> a
Prelude> :t apply add
apply add :: (Num t) => t -> t -> t
Prelude> :t add''
add'' :: Integer -> Integer -> Integer
Prelude>
¿Por qué add''
tiene un tipo diferente al de apply add
?
¿Es esta una rareza ghci, o esto es cierto en Haskell en general? (¿Y cómo puedo saber la diferencia?)
Es la restricción del monomorfismo . Cuando define un valor con un enlace de patrón simple (solo el nombre, sin ningún argumento de función) y sin una firma de tipo, obtiene un tipo monomórfico. Cualquier variable de tipo se intenta desambiguar de acuerdo con las reglas predeterminadas , si eso no tiene éxito, se obtiene un error de tipo.
En este caso, la variable de tipo restringido Num
se establece de forma predeterminada en Integer
.
Puede desactivar la restricción de monomorfismo con
ghci> :set -XNoMonomorphismRestriction
o con el indicador -XnoMonomorphismRestriction
en la línea de comando.