Haskell Language
Общие монады как свободные монады
Поиск…
Бесплатная пустая ~~ Identity
Дано
data Empty a
у нас есть
data Free Empty a
= Pure a
-- the Free constructor is impossible!
которая изоморфна
data Identity a
= Identity a
Free Identity ~~ (Nat,) ~~ Writer Nat
Дано
data Identity a = Identity a
у нас есть
data Free Identity a
= Pure a
| Free (Identity (Free Identity a))
которая изоморфна
data Deferred a
= Now a
| Later (Deferred a)
или эквивалентно (если вы обещаете сначала оценить первый элемент) (Nat, a)
, aka Writer Nat a
, с
data Nat = Z | S Nat
data Writer Nat a = Writer Nat a
Бесплатно Может быть ~~ MaybeT (Writer Nat)
Дано
data Maybe a = Just a
| Nothing
у нас есть
data Free Maybe a
= Pure a
| Free (Just (Free Maybe a))
| Free Nothing
что эквивалентно
data Hopes a
= Confirmed a
| Possible (Hopes a)
| Failed
или эквивалентно (если вы обещаете сначала оценить первый элемент) (Nat, Maybe a)
, aka MaybeT (Writer Nat) a
с
data Nat = Z | S Nat
data Writer Nat a = Writer Nat a
data MaybeT (Writer Nat) a = MaybeT (Nat, Maybe a)
Free (Writer w) ~~ Writer [w]
Дано
data Writer w a = Writer w a
у нас есть
data Free (Writer w) a
= Pure a
| Free (Writer w (Free (Writer w) a))
которая изоморфна
data ProgLog w a
= Done a
| After w (ProgLog w a)
или, что то же самое, (если вы обещаете сначала оценить журнал), Writer [w] a
.
Free (Const c) ~~ Либо c
Дано
data Const c a = Const c
у нас есть
data Free (Const c) a
= Pure a
| Free (Const c)
которая изоморфна
data Either c a
= Right a
| Left c
Free (Reader x) ~~ Reader (поток x)
Дано
data Reader x a = Reader (x -> a)
у нас есть
data Free (Reader x) a
= Pure a
| Free (x -> Free (Reader x) a)
которая изоморфна
data Demand x a
= Satisfied a
| Hungry (x -> Demand x a)
или эквивалентно Stream x -> a
с
data Stream x = Stream x (Stream x)
Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow