Разница между +1 и -1 - PullRequest
       16

Разница между +1 и -1

13 голосов
/ 06 марта 2011
> :t (+1)
(+1) :: Num a => a -> a

> :t (-1)
(-1) :: Num a => a

Почему второй не является функцией?Нужно ли писать (+(-1)) или есть способ получше?

Ответы [ 3 ]

9 голосов
/ 06 марта 2011

Это потому, что (-1) интерпретируется как отрицательный, однако (+1) интерпретируется как функция карри (\x->1+x).

В haskell (a **) является синтаксическим сахаром для (**) a, а (** a) - (\x -> x ** a). Однако (-) является частным случаем, так как он является унарным оператором (отрицание) и бинарным оператором (минус). Поэтому этот синтаксический сахар не может быть применен здесь однозначно. Когда вы хотите (\x -> a - x), вы можете написать (-) a, и, как уже ответили в Вычитание каррирования , вы можете использовать функции negate и subtract для устранения противоречий между унарным и двоичным - функции.

6 голосов
/ 06 марта 2011

Нужно ли писать (+ (- 1)) или есть лучший способ?

Я только что нашел функцию с именем subtract, поэтому я также могу сказать subtract 1. Я нахожу это вполне читабельным: -)

1 голос
/ 06 марта 2011

(-1) отрицательный, как отметили другие. Вычитаем одну функцию \x -> x-1, flip (-) 1 или даже (+ (-1)).

- рассматривается как особый случай в грамматике выражения . + нет, по-видимому, потому что положительные литералы не нуждаются в лидирующем плюсе, и разрешение этого приведет к еще большей путанице.

Редактировать : Я ошибся в первый раз. ((-) 1) - это функция «вычитать из одного», или (\x -> 1-x).

...