Monads/Writer monad: Difference between revisions
Content added Content deleted
(Added Wren) |
(added Perl programming solution) |
||
Line 685: | Line 685: | ||
<pre> |
<pre> |
||
(1.618033988749895, "obtained square root, added 1, divided by 2, ") |
(1.618033988749895, "obtained square root, added 1, divided by 2, ") |
||
</pre> |
|||
=={{header|Perl}}== |
|||
{{trans|Raku}} |
|||
<lang Perl># 20200704 added Perl programming solution |
|||
package Writer; |
|||
use strict; |
|||
use warnings; |
|||
sub new { |
|||
my ($class, $value, $log) = @_; |
|||
return bless [ $value => $log ], $class; |
|||
} |
|||
sub Bind { |
|||
my ($self, $code) = @_; |
|||
my ($value, $log) = @$self; |
|||
my $n = $code->($value); |
|||
return Writer->new( @$n[0], $log.@$n[1] ); |
|||
} |
|||
sub Unit { Writer->new($_[0], sprintf("%-17s: %.12f\n",$_[1],$_[0])) } |
|||
sub root { Unit sqrt($_[0]), "Took square root" } |
|||
sub addOne { Unit $_[0]+1, "Added one" } |
|||
sub half { Unit $_[0]/2, "Divided by two" } |
|||
print Unit(5, "Initial value")->Bind(\&root)->Bind(\&addOne)->Bind(\&half)->[1]; |
|||
</lang> |
|||
{{out}} |
|||
<pre> |
|||
Initial value : 5.000000000000 |
|||
Took square root : 2.236067977500 |
|||
Added one : 3.236067977500 |
|||
Divided by two : 1.618033988750 |
|||
</pre> |
</pre> |
||