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