fun_land v0.5.0 FunLandic.Product
Product
wraps numbers. Each Product
struct is a wrapper around a single number, and basically says:
‘I want to treat this number as something that, when combined with another number, should be multiplied, using 1
as neutral element’
This is necessary as there are multiple ways to combine numbers. Another, very common way is FunLandic.Sum
.
You can use Product
either as a Combinable, by just passing in a Reducable with numbers,
Or you can use Product
as Monad, by wrapping individual numbers and combining them using map
, apply_with
, wrap
and chain
.
Summary
Functions
Callback implementation for FunLand.Appliable.apply_with/2
Callback implementation for FunLand.Chainable.chain/2
This is called internally whenever a YourMonad.chain()
operation fails
Free implementation wrap Mappable.map for Applicative
The only things that make sense to put in a %Product{} are a number, or a function that will eventually evaluate to a number
Macros
Allows you to write multiple consecutive operations using this monad on new lines. This is called ‘monadic do-notation’
Functions
Callback implementation for FunLand.Appliable.apply_with/2
.
Callback implementation for FunLand.Chainable.chain/2
.
This is called internally whenever a YourMonad.chain()
operation fails.
For most monads, the default behaviour of crashing is great. For some, you might want to override it.
Macros
Allows you to write multiple consecutive operations using this monad on new lines. This is called ‘monadic do-notation’.
For more info, see FunLand.Monad.monadic
Rules:
- Every normal line returns a new instance of the monad.
- You can write
x <- some_expr_returning_a_monad_instance
to bindx
to whatever is inside the monad. You can then usex
on any subsequent lines. - If you want to use one or multiple statements, use
let something = some_statement
orlet something = do ...
The final line is of course expected to also return an instance of the monad.
Use wrap
at any time to wrap a value back into a monad if you need.
Inside the monadic context, the module of the monad that was defined is automatically imported.
Any local calls to e.g. wrap
, apply
, chain
or functions you’ve defined yourself in your monad module will thus be called on your module.