Префиксная форма унарного оператора в Haskell - PullRequest
3 голосов
/ 04 августа 2010

в GHCi:

  1. Прелюдия> (+3) 2
    5
  2. Прелюдия> (* 3) 2
    6
  3. Прелюдия> (/ 3) 2
    0,6666666666666666
  4. Прелюдия> (-3) 2
    Нет экземпляра для (Num (t -> t1))
    вытекает из буквального 3' at <interactive>:1:2<br> Possible fix: add an instance declaration for (Num (t -> t1))<br> In the expression: 3<br> In the expression: (- 3) 2<br> In the definition of it ': it = (- 3) 2

Как я могу исправить последний, чтобы он возвращал -1?

Ответы [ 4 ]

12 голосов
/ 04 августа 2010

Грамматика Haskell не позволяет вам использовать - таким образом. Вместо этого используйте функцию subtract:

(subtract 3) 2
7 голосов
/ 04 августа 2010

В качестве сноски к ответу grddev приведен соответствующий абзац из отчета Haskell 98 :

Специальная форма -e обозначает отрицание префикса, единственный префиксный оператор в Haskell, и синтаксис для negate (e).Бинарный оператор - не обязательно относится к определению - в Prelude;это может быть восстановлено модульной системой.Однако унарный - всегда будет ссылаться на функцию negate, определенную в Prelude.Нет никакой связи между локальным значением оператора - и унарным отрицанием.

Это то, что расстроило меня, когда я впервые столкнулся с этим: я не мог понять, почему операторы вели себя такиначе в этом контексте, когда :info (+) и :info (-) выглядят в основном одинаково.

Вы можете использовать subtract, как предполагает grddev, или вы можете просто определить новый инфиксный оператор:

Prelude> let (#) = (-)
Prelude> (# 3) 2
-1

subtract имеет то преимущество, что вы знакомы с другими людьми, которые могут читать ваш код.

1 голос
/ 04 августа 2010

Вы можете сделать

(-) 3 2

но это даст вам 1. Чтобы иметь -1, вам нужно связать 3 со вторым аргументом -, который вы можете сделать, используя

flip (-) 3 2
0 голосов
/ 05 августа 2010

Если вы хотите сохранить свою первоначальную форму, вы всегда можете добавить минус:

(+ -3)

Это не красиво, но немного больше подходит вашему образцу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...