Что эквивалентно (+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
Ответы
Ответ 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 +)
.