Префикс формы Унарного оператора в Haskell
-
25-09-2019 - |
Вопрос
В GHCI:
- Прелюдия> (+3) 2
5- Прелюдия> (* 3) 2
6- Прелюдия> (/ 3) 2
0.6666666666666666- Прелюдия> (-3) 2
Никакого экземпляра для (NUM (T -> T1)))
возникающий из буквального3' at <interactive>:1:2
Это: это = (- 3) 2
Possible fix: add an instance declaration for (Num (t -> t1))
In the expression: 3
In the expression: (- 3) 2
In the definition of
Как я могу исправить последнее, чтобы вернуть его -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)
Это не красиво, но это соответствует вашему узору немного больше.