Module: Fr::Monoid

Included in:
Additive, Array, Either, Maybe, Multiplicative, String
Defined in:
lib/fr/monoid.rb

Instance Method Summary collapse

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