Что такое лямбда-единица в 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
Ключевое слово присутствует во многих императивных языках.