Разница между +1 и -1
> :t (+1)
(+1) :: Num a => a -> a
> :t (-1)
(-1) :: Num a => a
Почему вторая не является функцией? Должен ли я писать (+(-1))
или есть лучший способ?
Ответы
Ответ 1
Это связано с тем, что (-1)
интерпретируется как отрицательный, однако (+1)
интерпретируется как каррическая функция (\x->1+x)
.
В haskell (a **)
- синтаксический сахар для (**) a
, а (** a)
- (\x -> x ** a)
. Однако (-)
является частным случаем, поскольку он является и унарным оператором (отрицательным), и двоичным оператором (минус). Поэтому этот синтаксический сахар не может быть применен однозначно здесь. Если вы хотите (\x -> a - x)
, вы можете написать (-) a
, и, как уже было сказано в вычитании вытравливания, вы можете использовать функции negate
и subtract
для устранения неоднозначности между унарными и двоичными функциями -
.
Ответ 2
Нужно ли писать (+ (- 1)) или есть лучший способ?
Я только что нашел функцию под названием subtract
, поэтому я также могу сказать subtract 1
. Я нахожу это вполне читаемым: -)
Ответ 3
(-1)
является отрицательным, как отмечали другие. Вычитание одной функции - \x -> x-1
, flip (-) 1
или действительно (+ (-1))
.
-
рассматривается как частный случай в грамматике выражений . +
не является, по-видимому, потому, что положительные литералы не нуждаются в лидирующем плюсе, и это может привести к еще большей путанице.
Изменить. В первый раз я ошибался. ((-) 1)
- это функция "вычесть из одного" или (\x -> 1-x)
.