Jump to content

Monads/Writer monad: Difference between revisions

no edit summary
m (→‎{{header|Phix}}: added syntax colouring, marked p2js compatible)
No edit summary
Line 970:
Added one : 3.236067977500
Divided by two : 1.618033988750
</pre>
 
=={{header|Ruby}}==
 
<lang ruby># 20220720 Ruby programming solution
class Writer
attr_reader :value, :log
 
def initialize(value, log = "New")
@value = value
if value.is_a? Proc
@log = log
else
@log = log + ": " + @value.to_s
end
end
 
def self.unit(value, log)
Writer.new(value, log)
end
 
def bind(mwriter)
proc = mwriter.value
log = mwriter.log
new_value = proc.call(@value)
new_log = @log + "\n" + log
self.class.new(new_value, new_log)
end
end
 
lam_sqrt = ->(number) { Math.sqrt(number) }
lam_add_one = ->(number) { number + 1 }
lam_half = ->(number) { number / 2.0 }
 
sqrt = Writer.unit( lam_sqrt, "Took square root")
add_one = Writer.unit( lam_add_one, "Added one")
half = Writer.unit( lam_half, "Divided by 2")
 
m1 = Writer.unit(5, "Initial value")
m2 = m1.bind(sqrt).bind(add_one).bind(half)
 
puts "The final value is #{m2.value}\n\n"
puts "This value was derived as follows:"
puts m2.log
 
{{Out}}
<pre>
The final value is 1.618033988749895
 
This value was derived as follows:
Initial value: 5
Took square root: 2.23606797749979
Added one: 3.23606797749979
Divided by 2: 1.618033988749895
</pre>
 
Anonymous user
Cookies help us deliver our services. By using our services, you agree to our use of cookies.