Module: Fr::Monoid
Instance Method Summary collapse
-
#filter(f, ma = nil) ⇒ Object
-
Monad m, Monoid m => (a -> Bool) -> m a -> m a.
-
#guard(bool) ⇒ Object
-
Monad m, Monoid m => Bool -> m ().
-
#sum(ms) ⇒ Object
-
Monoid m => [m] -> m.
Instance Method Details
#filter(f, ma = nil) ⇒ Object
-
Monad m, Monoid m => (a -> Bool) -> m a -> m a
>> m.filter(lambda{|x| x.odd? }).call(m.unit(10))
> m.zero
Not supported: >> m.unit(10).filter{|x| x.odd? }
> m.zero
38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/fr/monoid.rb', line 38 def filter(f, ma = nil) rest = lambda do |ma| bind(ma) do |a| f.call(a) ? unit(a) : zero end end (ma.nil?) ? rest : rest.call(ma) end |
#guard(bool) ⇒ Object
-
Monad m, Monoid m => Bool -> m ()
>> m.guard(false)
> m.zero
Not supported: >> true.guard(m.unit(x))
> m.unit(x)
24 25 26 27 |
# File 'lib/fr/monoid.rb', line 24 def guard(bool) bool ? unit(nil) : zero end |
#sum(ms) ⇒ Object
-
Monoid m => [m] -> m
>> [m.unit(1), m.unit(2)].sum
> m.plus(m.plus(m.zero, m.unit(1)), m.unit(2))
11 12 13 |
# File 'lib/fr/monoid.rb', line 11 def sum(ms) ms.inject(zero){|sum,m| plus(sum, m) } end |