Префиксная форма унарного оператора в Haskell

В GHCi:

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

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

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

 (subtract 3) 2 

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

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

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

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

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

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

Ты можешь сделать

 (-) 3 2 

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

 flip (-) 3 2 

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

 (+ -3) 

Это некрасиво, но это соответствует вашему шаблону немного больше.

Давайте будем гением компьютера.