Haskell Language
Vanliga monader som fria monader
Sök…
Gratis tom ~ ~ identitet
Given
data Empty a
vi har
data Free Empty a
= Pure a
-- the Free constructor is impossible!
vilket är isomorf för
data Identity a
= Identity a
Fri identitet ~ ~ (Nat,) ~ ~ Författare Nat
Given
data Identity a = Identity a
vi har
data Free Identity a
= Pure a
| Free (Identity (Free Identity a))
vilket är isomorf för
data Deferred a
= Now a
| Later (Deferred a)
eller motsvarande (om du lovar att utvärdera det första elementet först) (Nat, a)
, alias Writer Nat a
, med
data Nat = Z | S Nat
data Writer Nat a = Writer Nat a
Gratis kanske ~ ~ KanskeT (Writer Nat)
Given
data Maybe a = Just a
| Nothing
vi har
data Free Maybe a
= Pure a
| Free (Just (Free Maybe a))
| Free Nothing
vilket motsvarar
data Hopes a
= Confirmed a
| Possible (Hopes a)
| Failed
eller likvärdigt (om du lovar att utvärdera det första elementet först) (Nat, Maybe a)
, alias MaybeT (Writer Nat) a
med
data Nat = Z | S Nat
data Writer Nat a = Writer Nat a
data MaybeT (Writer Nat) a = MaybeT (Nat, Maybe a)
Gratis (Writer w) ~~ Writer [w]
Given
data Writer w a = Writer w a
vi har
data Free (Writer w) a
= Pure a
| Free (Writer w (Free (Writer w) a))
vilket är isomorf för
data ProgLog w a
= Done a
| After w (ProgLog w a)
eller, motsvarande, (om du lovar att utvärdera loggen först), Writer [w] a
.
Gratis (Const c) ~ ~ Antingen c
Given
data Const c a = Const c
vi har
data Free (Const c) a
= Pure a
| Free (Const c)
vilket är isomorf för
data Either c a
= Right a
| Left c
Gratis (Reader x) ~ ~ Reader (Stream x)
Given
data Reader x a = Reader (x -> a)
vi har
data Free (Reader x) a
= Pure a
| Free (x -> Free (Reader x) a)
vilket är isomorf för
data Demand x a
= Satisfied a
| Hungry (x -> Demand x a)
eller motsvarande Stream x -> a
med
data Stream x = Stream x (Stream x)
Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow