2011-12-28 3 views
8

Cuando se trabaja en el intérprete, a menudo es conveniente unir una función a un nombre, por ejemplo:¿Cuándo puedo vincular una función a otro nombre?

ghci> let f = (+1) 
ghci> f 1 
2 

Este alias de nombre f a la función (+1). Sencillo.

Sin embargo, esto no siempre funciona. Un ejemplo que he encontrado que causa un error es tratar de alias nub desde el módulo Data.List. Por ejemplo,

ghci> :m Data.List 
ghci> nub [1,2,2,3,3,3] 
[1,2,3] 
ghci> let f = nub 
ghci> f [1,2,2,3,3,3] 

<interactive>:1:14: 
    No instance for (Num()) 
     arising from the literal `3' 
    Possible fix: add an instance declaration for (Num()) 
    In the expression: 3 
    In the first argument of `f', namely `[1, 2, 2, 3, ....]' 
    In the expression: f [1, 2, 2, 3, ....] 

Sin embargo, si me declaran explícitamente el argumento x entonces funciona sin error:

ghci> let f x = nub x 
ghci> f [1,2,2,3,3,3] 
[1,2,3] 

¿Puede alguien explicar este comportamiento?

+7

Consulte [esta pregunta y su respuesta] (http://stackoverflow.com/questions/4575040/what-is-xnomonomorphismrestriction). – gspr

+0

Gracias. Si publicaste eso como una respuesta (posiblemente un poco expandida) entonces lo aceptaría. –

+1

Nah, crédito por el que debe pagarse el crédito (es decir, la respuesta a la que me he vinculado). :-) – gspr

Respuesta

3

Las reglas de error de tipo en las versiones actuales de Ghci son algo inescrutables.

Puede suministrar una firma tipo para f. O agregue :set -XNoMonomorphismRestriction a su archivo ~/.ghci como lo informó Chris anteriormente.

Cuestiones relacionadas