Когда я могу связать функцию с другим именем? - PullRequest
9 голосов
/ 28 декабря 2011

При работе в интерпретаторе часто удобно связать функцию с именем, например:

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 Ответ

3 голосов
/ 28 декабря 2011

Тип по умолчанию правила в текущих версиях Ghci несколько непостижимы.

Вы можете указать тип подписи для f. Или добавьте :set -XNoMonomorphismRestriction к вашему ~/.ghci файлу, как советовал Крис ранее.

...