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?
Consulte [esta pregunta y su respuesta] (http://stackoverflow.com/questions/4575040/what-is-xnomonomorphismrestriction). – gspr
Gracias. Si publicaste eso como una respuesta (posiblemente un poco expandida) entonces lo aceptaría. –
Nah, crédito por el que debe pagarse el crédito (es decir, la respuesta a la que me he vinculado). :-) – gspr