Current section
Files
Jump to
Current section
Files
lib/monad/law.ex
defmodule Monad.Law do
@moduledoc false
use Monad.Operators
# The three monad laws, see:
# https://www.haskell.org/haskellwiki/Monad_laws
# https://en.wikipedia.org/wiki/Monad_(functional_programming)#Monad_laws
# http://codeplease.io/monads/
# In Haskell:
# (return x) >>= f ≡ f x
@doc false
def left_identity?(value, return_fun, fun) do
(return_fun.(value) ~>> fun) == fun.(value)
end
# In Haskell:
# m >>= return ≡ m
@doc false
def right_identity?(monad, return_fun) do
(monad ~>> return_fun) == monad
end
# In Haskell:
# (m >>= f) >>= g ≡ m >>= ( \x -> (f x >>= g) )
@doc false
def associativity?(monad, fun1, fun2) do
(monad ~>> fun1 ~>> fun2) == (monad ~>> &(fun1.(&1) ~>> fun2))
end
end