Вопрос

В 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
    Possible fix: add an instance declaration for (Num (t -> t1))
    In the expression: 3
    In the expression: (- 3) 2
    In the definition of
    Это: это = (- 3) 2

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

Это было полезно?

Решение

Грамматика Haskell не позволяет вам использовать - как это. Использовать subtract Функция вместо этого:

(subtract 3) 2

Другие советы

Как сноска для Ответ ГрДдева, Вот соответствующий абзац из Haskell 98 доклад:

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

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

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

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

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

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

(-) 3 2

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

flip (-) 3 2

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

(+ -3)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top