2011-05-19 11 views
15

Empiezo Haskell ... Intenté escribir la siguiente función trivial de dos maneras diferentes, dejando que Haskell decidiera los tipos, y el sistema de tipos hace algo diferente en cada caso. ¿Cuál es la explicación de ese comportamiento?Transformar una función en un estilo sin puntos cambia su tipo

Prelude> let f x = 2 * x 
Prelude> let g = (2*) 
Prelude> :info f 
f :: Num a => a -> a -- Defined at <interactive>:1:5 
Prelude> :info g 
g :: Integer -> Integer  -- Defined at <interactive>:1:5 

¡Gracias!

+0

posible duplicado de (http://stackoverflow.com/questions/32496864/what-is-the-monomorphism-restriction) – Bakuriu

Respuesta

12

Esto se conoce como monomorphism restriction.

Básicamente, significa que los enlaces de nivel superior que se parecen a x = están obligados a ser no polimórficos, a menos que especifique una firma de tipo. Las vinculaciones con argumentos, es decir, f x =, no se ven afectadas. Consulte el enlace para obtener detalles sobre por qué existe esta restricción.

Normalmente, aparece un mensaje de error cuando se aplica la restricción, pero en este caso GHCi puede usar el tipo predeterminado para cambiar el tipo Num a => a a Integer.

La forma más fácil de esquivar es para cualquiera que use una firma de tipo explícita, o poner

{-# LANGUAGE NoMonomorphismRestriction #-} 

en la parte superior de su módulo, o ejecutar GHCi con -XNoMonomorphismRestriction.

+0

¿Me equivoco, o debería ser "... estoy obligado a ser no-ad-hoc-polimórfico"? 'let f = []' parece mantener su polimorfismo bien en ghci. – dainichi

1

Debido a que la definición de g no nombra explícitamente sus argumentos, se corre en el monomorphism restriction, evitando g de ser polimórficos y (en este caso) que causa GHC por defecto a Integer.

+0

Una cosa más que debo aprender :-) ¡Gracias! – Frank

3

Como han señalado otros, esto es causado por algo llamado "Restricción de monomorfismo".

MR puede ser útil para los redactores de compiladores Haskell, y existe controversia acerca de si vale la pena tener en el lenguaje en general. Pero hay una cosa con la que todos están de acuerdo: en el prompt de GHCi, MR no es más que una molestia.

MR probablemente estará desactivado por defecto en este contexto en una próxima versión de GHC. Por ahora, debe desactivarlo en GHCi mediante la creación de un archivo de texto llamado ".ghci" en su directorio que contiene una línea como esta: [? ¿Cuál es la restricción monomorphism]

:set -XNoMonomorphismRestriction 
Cuestiones relacionadas