I. Semigroep | |
---|---|
Voorbeelden Constructor: * |
Set gehele getallen met + of * operatie: (4 + 10) + 2 = 4 + (10 +2) Voorbeelden zonder identity: positieve gehele getallen met + operator, of niet-lege sequenties.
|
Laws |
Closure en Associativity |
Operatie |
append |
II. Monoid | |
---|---|
Voorbeelden |
Set gehele getallen met + of * operatie: a+0=a, a*1=a Lists, Bool, Ordering, Maybe, zelfgedefinieerde Tree. Verzameling met operatie, die je (recursief) kunt uitbreiden.
|
Laws |
Als Semigroep, met Identity
mconcat is een secundaire functie die een lijst monoids via een fold-operatie reduceert tot een enkele waarde. (mconcat is een ongelukkige naam, bij een optelling bijvoorbeeld wordt er niets aan elkaar geplakt.) |
Operaties |
Als Semigroep, aangevuld met de zero-operatie. |
III. Functor | |
---|---|
Voorbeelden Unary type constructor: *->* Binary type constructor: *->*->* Functor[F[_]] |
Scala: List, Option, Set, Either, Try, Future... Haskell: List, Maybe, eigen Tree, Either, Function ... "Alles waarover gemapt kan worden", het toepassen van een functie op waarde[n] in een context.
Mapping over een functie is functie-composition (Nicholas, zie ook LYAH Functor)
|
Laws |
Identity en Compose
|
Operatie |
Eén typeclass-methode: fmap :: (a -> b) -> f a -> f b (map is de List-implementatie van fmap) Map, Either, Function1 zijn binary, daarbij moet de operatie partieel, in stappen worden toegepast.
|
IV. Applicative (-Functor) | |
---|---|
Voorbeelden |
Voorlopig: De toegepaste functie kan zich zelf ook binnen een context bevinden |
Laws |
|
Operaties |
Als Functor, met Pure (Wrapt value in applicative), en ap of <*>(Neemt een applicative met een functie er in en een andere applicative, extraheert de functie(s) uit de eerste en mapt die over de tweede). Applicatives zijn composable, wat niet voor elke Monad zo is. |
V. Monad | |
---|---|
Voorbeelden Higher order type operator: (*->*)->* Monad[M[_]] M[_] staat voor een unary type-constructor als List of Option
|
Scala: List, Option, Set, Either, Try, Future... Haskell: List, Maybe, Tree?, Either, ... "Informeel is een Monad alles met een constructor en een flatMap methode."
|
Laws |
|
Operaties
|
Als Applicative, met bind, >>= of do-notation. (In Scala: flatMap.) Naast bind dient return voor het wrappen van een waarde in de monad (een "lift"-functie, zoals pure bij de applicative), en >> ("then") voor het chainen van monadische acties die het resultaat van de voorganger niet nodig hebben. fail is alleen intern nodig voor pattern-match failures in do-notation. |