Monad.Behaviour behaviour
A behaviour that provides the common code for monads.
Creating a monad consists of three steps:
By completing the above steps, the monad will automatically conform to the
Functor
and Applicative
protocols in addition to the Monad
protocol.
Example
The following is an example showing how to use Monad.Behaviour
.
iex> defmodule Monad.Identity.Sample do
...> use Elixir.Monad.Behaviour # The `Elixir` prefix is needed for the doctest.
...>
...> defstruct value: nil
...>
...> def return(value) do
...> %Monad.Identity.Sample{value: value}
...> end
...>
...> def bind(%Monad.Identity.Sample{value: value}, fun) do
...> fun.(value)
...> end
...>
...> def unwrap(%Monad.Identity.Sample{value: value}) do
...> value
...> end
...> end
iex> m = Monad.Identity.Sample.return 42
iex> Monad.Identity.Sample.unwrap m
42
iex> m2 = Elixir.Monad.bind m, (& Monad.Identity.Sample.return &1 * 2)
iex> Monad.Identity.Sample.unwrap m2
84
Summary↑
bind(module, monad, fun) | Calls |
return(module, value) | Calls |
Types ↑
Functions
Specs:
Calls module
‘s bind/2
function.
Unwraps monad
then applies the wrapped value to fun
. Returns a new monad.
Specs:
- return(atom, term) :: t
Calls module
‘s return/1
function.
Wraps the given value in the specified monad.
Callbacks
Specs:
Specs:
- return(value :: term) :: t