Разница между +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).