2011-05-28 6 views
8

No esperaba el siguiente código para trabajar:¿Por qué Haskell parece tener por defecto la lectura de Int al leer Num?

foo :: (Num a) => a -> a 
foo x = x + x 

main = do 
    print (foo (read "7")) 

porque no es posible deducir totalmente el tipo de (léase "7") basado en el código. Pero GHC (6.12.3) piensa lo contrario e imprime 14.

Si "7" se cambia a "7.2", el código falla con "sin analizar". ¿Que está pasando aqui? ¿Cómo está Haskell decidiendo qué instancia de Read usar?

+0

'(Num a, leer un) => [Char] -> a' es claramente ambiguo. Tiene que decidir de alguna manera, así que supongo que 'Int' es el predeterminado para' Num'. Tal vez porque es la primera instancia de la clase de tipo de alguna manera? Voy a ir a la búsqueda manual. Es una pregunta interesante. – alternative

+0

Solo para el registro: su valor predeterminado es 'Integer', no' Int'. – sepp2k

Respuesta

12

Esto es causado por defaulting rules for the Num class de Haskell. Si ha añadido

default (Double, Integer) 

a la parte superior de su archivo, a continuación, se obtendría los siguientes resultados:

main = do 
    print (foo (read "7")) -- prints "14.0" 
    print (foo (read "7.2")) -- prints "14.2" 

En pocas palabras, las reglas morosos son un intento de "tratar de hacer lo correcto "y lo salve de un error de compilación cuando tiene un tipo ambiguo en su programa. Desafortunadamente en este caso intercambia un error de tiempo de compilación por un error de tiempo de ejecución.

Puede desactivar el impago de este modo:

default() 

la que le obligará a eliminar la ambigüedad de manera explícita los tipos de tales términos a través de anotaciones de tipo:

print (foo (read "7" :: Int)) 
2

Int es el tipo predeterminado en esta instancia. Ver sec. 6.3, ambigüedad y tipo predeterminado, en una historia de Haskell: ser flojo con la clase,

+2

Noy 'Int', pero' Entero' es el valor predeterminado. – augustss

+4

Gracias por esa referencia. Aquí está la oración que deja en claro por qué iban a incluir una característica como no Haskell: "Realizar cálculos numéricos en constantes es una de las primeras cosas que hace un programador Haskell". Por lo tanto, si ghci falla en 2 + 2, es posible que algunas personas se desconecten. – Owen

Cuestiones relacionadas