Подтвердить что ты не робот

Что эквивалентно (+1) для вычитания, так как (-1) рассматривается как отрицательное число?

Возможный дубликат:
Вычитание вычитания

Я начал свой первый проект haskell, который не из учебника, и, конечно, я натыкаюсь на самые простые вещи.

У меня есть следующий код:

moveUp y = modifyMVar_ y $ return . (+1)
moveDn y = modifyMVar_ y $ return . (-1)

Мне потребовалось некоторое время, чтобы понять, почему мой код не будет компилироваться: я использовал (-1), который считается отрицательным. Брекетинг минус не помогает, поскольку он префиксы его и делает 1 его первым параметром.

Короче говоря, что такое бесплатная версия этой версии?

dec :: Num a => a -> a
dec x = x - 1
4b9b3361

Ответ 1

Я считаю, что вы хотите удобную функцию subtract, которая существует именно по той причине, которую вы обнаружили:

subtract :: Num a => a -> a -> a

то же, что и flip (-).

Поскольку - обрабатывается специально в грамматике Haskell, (- e) не является разделом, а является приложением отрицания префикса. Однако (subtract exp) эквивалентно запрещенному разделу.

Если вы хотите записать его без использования функции, например subtract, вы можете использовать flip (-), как указано в документации Prelude. Но это... любопытное уродство.

Ответ 2

Вы можете использовать функцию subtract (которая находится в стандартной прелюдии).

moveDn y = modifyMVar_ y $ return . (subtract 1)

Вы также можете использовать флип для изменения параметров, которые - принимает.

moveDn y = modifyMVar_ y $ return . (flip (-) 1)

Ответ 3

Если вышеупомянутый subtract слишком многословный, вы можете попробовать что-то вроде (+ (-1)) или (-1 +).