post(typoclassopedia): Monads#Laws
This commit is contained in:
parent
52fcc103e1
commit
2a22aae326
@ -651,3 +651,46 @@ instance Monad Maybe where
|
||||
fmap f a = a >>= (return . f)
|
||||
join m = m >>= id
|
||||
```
|
||||
|
||||
## Laws
|
||||
|
||||
Standard:
|
||||
|
||||
```haskell
|
||||
return a >>= k = k a
|
||||
m >>= return = m
|
||||
m >>= (\x -> k x >>= h) = (m >>= k) >>= h
|
||||
```
|
||||
|
||||
In terms of `>=>`:
|
||||
|
||||
```haskell
|
||||
return >=> g = g
|
||||
g >=> return = g
|
||||
(g >=> h) >=> k = g >=> (h >=> k)
|
||||
```
|
||||
|
||||
### Exercises
|
||||
|
||||
1. Given the definition `g >=> h = \x -> g x >>= h`, prove the equivalence of the above laws and the standard monad laws.
|
||||
|
||||
**Solution**:
|
||||
|
||||
```haskell
|
||||
return >=> g
|
||||
= \x -> return x >>= g
|
||||
= \x -> g x
|
||||
= g
|
||||
|
||||
g >=> return
|
||||
= \x -> g x >>= return
|
||||
= \x -> g x
|
||||
= g
|
||||
|
||||
g >=> (h >=> k)
|
||||
= \y -> g y >>= (\x -> h x >>= k)
|
||||
= \y -> (g y >>= h) >>= k
|
||||
= \y -> (\x -> g x >>= h) y >>= k
|
||||
= (\x -> g x >>= h) >=> k
|
||||
= (g >=> h) >=> k
|
||||
```
|
||||
|
Loading…
Reference in New Issue
Block a user