Maybe monad for crystal

Exactly. In Crystal map is Object#try. As an example, the code presented in the rosettacode for Ruby:

class Maybe
  def initialize(value)
    @value = value
  end
 
  def map
    if @value.nil?
      self
    else
      Maybe.new(yield @value)
    end
  end
end

Maybe.new(3).map { |n| 2*n }.map { |n| n+1 }
#=> #<Maybe @value=7>
 
Maybe.new(nil).map { |n| 2*n }.map { |n| n+1 }
#=> #<Maybe @value=nil>
 
Maybe.new(3).map { |n| nil }.map { |n| n+1 }
#=> #<Maybe @value=nil>

Becomes in Crystal:

3.try { |n| 2*n }.try { |n| n+1 }
#=> 7
 
nil.try { |n| 2*n }.try { |n| n+1 }
#=> nil
 
3.try { |n| nil }.try { |n| n+1 }
#=> nil

Look ma, no wrapper! :smile:

5 Likes