25 lines
1.2 KiB
Org Mode
25 lines
1.2 KiB
Org Mode
:PROPERTIES:
|
|
:ID: 8ee5037f-0673-4968-9ec4-184bf31dd72d
|
|
:END:
|
|
#+title: Monad
|
|
|
|
#+begin_quote
|
|
A monad is just a [[id:434ee61c-4461-424f-8dba-5c86ddb06c3c][monoid]] in the category of endofunctors.
|
|
#+end_quote
|
|
|
|
In [[id:9e68d422-cced-4177-96d1-90f777b9a493][Software Development]], this refers to an [[id:10eb4672-19ab-4275-a110-5446c96e7e24][Applicative Functor]] that provides a
|
|
method for applyling a function taking a bare value and returning a wrapped
|
|
value to a value already wrapped in that same type.
|
|
|
|
In [[id:9ac78677-2602-4a06-af0a-4ed82e98a9b6][Haskell]], the function to do this is called *bind*, and is available as the
|
|
infix operator ~>>=~. This method is useful for sequentially applying functions
|
|
which generate values wrapped in a Monad, abstracting away logic between each
|
|
sequential application. This behavior leads some people to refer to Monads as
|
|
"programmable semicolons", referring to imperative, C-like languages in which
|
|
each line of code is terminated with a semicolon and executed in sequence.
|
|
Haskell's "do notation" provides syntactic sugar for codifying such sequences.
|
|
|
|
#+caption: Bind function in Haskell
|
|
#+begin_src haskell :exports code
|
|
(>>=) :: Monad m => m a -> (a -> m b) -> m b
|
|
#+end_src
|