Functor, Applicative, Monad, a play
Posted on July 17, 2019
A dialogue between context and focus, container and containee, computation and value.
context? focus! ?!
context? _ ?
_ focus! !Functor
Functor’s fmap alters the focus, the context is unchanged.
fmap alter (context focus) = context (alter focus) ?!
fmap alter (context _ ) = context _ ?
fmap alter ( _ focus) = _ (alter focus) !The context asks.
fmap alter (context focus) = context (alter focus) ?!
fmap alter (context _ ) = context _ ?
context = context ?The focus answers.
fmap alter (context focus) = context (alter focus) ?!
fmap alter ( _ focus) = _ (alter focus) !
alter focus = alter focus !Applicative
Applicative’s (<*>) combines foci and contexts simultaneously.
context1 focus1 <*> context2 focus2 = (context1 <> context2) (focus1 focus2) ?!
_ focus1 <*> _ focus2 = _ (focus1 focus2) !
context1 _ <*> context2 _ = (context1 <> context2) _ ?The (<>) of semigroups and monoids is a metaphor.
Only a metaphor?
Foci tell.
context1 focus1 <*> context2 focus2 = (context1 <> context2) (focus1 focus2) ?!
_ focus1 <*> _ focus2 = _ (focus1 focus2) !
focus1 focus2 = focus1 focus2 !Contexts explain.
context1 focus1 <*> context2 focus2 = (context1 <> context2) (focus1 focus2) ?!
context1 _ <*> context2 _ = (context1 <> context2) _ ?
context1 < > context2 = context1 <> context2 ?Monad
Monad’s join nests contexts:
join (context1 (context2 focus)) = (context1 . context2) focus ?!
join ( _ ( _ focus)) = _ focus !
join (context1 (context2 _ )) = (context1 . context2) _ ?The (.) of functions is a metaphor.
(.) makes a fine
(<>):
every Monad is an Applicative.
Is (.) the only (<>)?
A focused mind.
join (context1 (context2 focus)) = (context1 . context2) focus ?!
join ( _ ( _ focus)) = _ focus !
focus = focus !A contemplative context.
join (context1 (context2 focus)) = (context1 . context2) focus ?!
join (context1 (context2 _ )) = (context1 . context2) _ ?
context1 (context2 _ ) = (context1 . context2) _ ?Divide and conquer
data Writer w a = Write w a
div <$> Write "no" 42 <*> Write "thing" 6 = Write "nothing" 9 ?!
div 42 6 = 9 !
"no" < > "thing" = "nothing" ?Order and chaos
data Maybe b = Nothing | Just b
(>) <$> Just True <*> Just False = Just True ?!
_ <$> Just _ <*> Just _ = Just _ ?
Just Just = Just ?
Just Nothing = Nothing ?
join (Just Nothing) = Nothing ?!Everything and nothing
(^) <$> (\x -> 0) <*> (\x -> x) = (\x -> 0 ^ x) ?!
(^) 0 x = 0 ^ x !
(\x -> ) (\x -> ) = (\x -> ) ?