Что такое лямбда-единица в haskell?

Я новичок в Haskell и пытаюсь понять это определение счетчика на основе StateMonad. Я знаю, что в лямбдах обычно есть переменные, например

(\n -> n + 1)

это функция, которая принимает аргумент n, увеличивает его значение на 1 и возвращает результат. Однако в этом случае вместо переменной есть значение, пустой кортеж (единица измерения).

tick :: StateMonad Int Int
tick = fetch >>= (\n -> store (n + 1) >>= (\() -> return n))

Это взято из Обобщающих Монад до Стрелок стр. 5.

1 ответ

Решение

Технически, аргументы лямбда-выражения на самом деле являются шаблонами в Haskell (посмотрите первый случай EBNF для exp в отчете по Haskell 98). Так что я могу написать такую ​​функцию, как \(x,y) -> x + y который делает то же самое, что и \t -> fst t + snd t, В этом случае, \() -> return n сопоставление с образцом по единственно возможному значению типа () - () сам.


Вот аналогия, изложенная явно. Так же, как я могу написать функцию

f :: Num a => (a,a) -> a
f t = fst t + snd t

Я также могу написать эту функцию, используя сопоставление с образцом

f' :: Num a => (a,a) -> a
f' (x,y) = x + y

То же самое относится и к лямбда-выражениям: я мог бы написать \(x,y) -> x + y, Затем лямбда \() -> return n это то же самое, за исключением того, что сопоставление с образцом по значениям типа () тривиально: единственно возможное значение (),

РЕДАКТИРОВАТЬ

На всякий случай, если это не ясно, return :: Monad m => a -> m a это обычная функция, которая помещает значение в минимальный монадический контекст, не имеющий ничего общего с return Ключевое слово присутствует во многих императивных языках.

Другие вопросы по тегам