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
Source

Summary

bind(module, monad, fun)

Calls module‘s bind/2 function

return(module, value)

Calls module‘s return/1 function

Types

t :: Monad.t

bind_fun :: (term -> t)

Functions

bind(module, monad, fun)

Specs:

  • 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.

Source
return(module, value)

Specs:

  • return(atom, term) :: t

Calls module‘s return/1 function.

Wraps the given value in the specified monad.

Source

Callbacks

bind/2

Specs:

Source
return/1

Specs:

  • return(value :: term) :: t
Source