В качестве сноски к ответу grddev приведен соответствующий абзац из отчета Haskell 98 :
Специальная форма -e
обозначает отрицание префикса, единственный префиксный оператор в Haskell, и синтаксис для negate
(e)
.Бинарный оператор -
не обязательно относится к определению -
в Prelude;это может быть восстановлено модульной системой.Однако унарный -
всегда будет ссылаться на функцию negate
, определенную в Prelude.Нет никакой связи между локальным значением оператора -
и унарным отрицанием.
Это то, что расстроило меня, когда я впервые столкнулся с этим: я не мог понять, почему операторы вели себя такиначе в этом контексте, когда :info (+)
и :info (-)
выглядят в основном одинаково.
Вы можете использовать subtract
, как предполагает grddev, или вы можете просто определить новый инфиксный оператор:
Prelude> let (#) = (-)
Prelude> (# 3) 2
-1
subtract
имеет то преимущество, что вы знакомы с другими людьми, которые могут читать ваш код.