¿Qué está pasando con los tipos en esta sesión de ghci?

Estoy aprendiendo Haskell, y estaba jugando en ghci cuando me encontré con algo muy desconcertante.

Primero, cree una función de suma simple:

Prelude> let add x y = x + y

Tenga en cuenta que funciona con enteros y flotantes:

Prelude> add 3 4
7
Prelude> add 2.5 1.3
3.8

Ahora cree una función de aplicación. es identico 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

Bien, ahora haz 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.

Estos son 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 que add' tener un tipo diferente a apply add?

¿Es esto una rareza de ghci, o es cierto en Haskell en general? (¿Y cómo puedo notar la diferencia?)

preguntado el 12 de junio de 12 a las 20:06

Tan pronto como escucho "Estaba jugando en ghci y vi algo extraño", pienso "Restricción de monomorfismo" -

1 Respuestas

Es el 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. Las variables de cualquier tipo se intentan desambiguar de acuerdo con el reglas por defecto, si eso no tiene éxito, obtiene un error de tipo.

En este caso, el Num la variable de tipo restringido se establece de forma predeterminada en Integer.

Puede desactivar la restricción de monomorfismo con

ghci> :set -XNoMonomorphismRestriction

o con el -XnoMonomorphismRestriction bandera en la línea de comando.

Respondido el 12 de junio de 12 a las 20:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.