Когда я могу связать функцию с другим именем?
При работе в интерпретаторе часто удобно привязать функцию к имени, например:
ghci> let f = (+1)
ghci> f 1
2
Это псевдонимы f
к функции (+1)
, Просто.
Однако это не всегда работает. Один пример, который я нашел, который вызывает ошибку, пытается псевдоним nub
от Data.List
модуль. Например,
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, ....]
Тем не менее, если я явно изложить аргумент x
тогда это работает без ошибок:
ghci> let f x = nub x
ghci> f [1,2,2,3,3,3]
[1,2,3]
Кто-нибудь может объяснить это поведение?
1 ответ
Решение
Правила по умолчанию для типов в текущих версиях Ghci несколько непостижимы.
Вы можете указать тип подписи для f
, Или добавить :set -XNoMonomorphismRestriction
на ваш ~/.ghci
файл, как было рекомендовано Крисом ранее.