Ошибка «Нет экземпляра для» - PullRequest
6 голосов
/ 03 июня 2011

По примеру в http://en.wikibooks.org/wiki/Haskell/Beginning

Prelude> let abs x = if x < 0 then -x else x
Prelude> abs 5
5
Prelude> abs -3

<interactive>:1:6:
    No instance for (Num (a0 -> a0))
      arising from the literal `3'
    Possible fix: add an instance declaration for (Num (a0 -> a0))
    In the second argument of `(-)', namely `3'
    In the expression: abs - 3
    In an equation for `it': it = abs - 3

Что не так?

Ответы [ 2 ]

14 голосов
/ 03 июня 2011

Хаскелл думает, что вы пытаетесь вычесть 3 из abs, и жалуется, что abs - это не число.Вам необходимо добавить круглые скобки при использовании унарного оператора отрицания:

abs (-3)
5 голосов
/ 03 июня 2011

Переводчик думает, что вы имеете в виду abs - 3, а не abs (-3).Вам нужны скобки для устранения неоднозначности кода и чтобы было ясно, что вы собираетесь использовать унарную функцию "-", а не оператор вычитания.

...