MonadEx v1.1.3 Monad.Behaviour behaviour View Source

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

Link to this section Summary

Functions

Calls module’s bind/2 function

Calls module’s return/1 function

Link to this section Types

Link to this section Functions

Link to this function bind(module, monad, fun) View Source
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.

Link to this function return(module, value) View Source
return(atom(), term()) :: t()

Calls module’s return/1 function.

Wraps the given value in the specified monad.

Link to this section Callbacks

Link to this callback bind(monad, fun) View Source
bind(monad :: t(), fun :: bind_fun()) :: t()
Link to this callback return(value) View Source
return(value :: term()) :: t()