MonadEx v1.1.0 Monad.Behaviour behaviour

A behaviour that provides the common code for monads.

Creating a monad consists of three steps:

  1. Call use Monad.Behaviour
  2. Implement return/1
  3. Implement bind/2

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

Functions

Calls module’s bind/2 function

Calls module’s return/1 function

Types

bind_fun()
bind_fun :: (term -> t)
t()
t :: Monad.t

Functions

bind(module, monad, fun)
bind(atom, t, (term -> t)) :: t

Calls module’s bind/2 function.

Unwraps monad then applies the wrapped value to fun. Returns a new monad.

return(module, value)
return(atom, term) :: t

Calls module’s return/1 function.

Wraps the given value in the specified monad.

Callbacks

bind(monad, fun)
bind(monad :: t, fun :: bind_fun) :: t
return(value)
return(value :: term) :: t