simbolos programa opciones mundo multiplicar imprimir hola hacer como basico haskell ghci

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.