Monads/Writer monad: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) (Promote to task, lots of examples, little controversy) |
(Added Wren) |
||
Line 804: | Line 804: | ||
Added one : 3.236067977500 |
Added one : 3.236067977500 |
||
Divided by two : 1.618033988750 |
Divided by two : 1.618033988750 |
||
</pre> |
|||
=={{header|Wren}}== |
|||
{{trans|Go}} |
|||
{{libheader|Wren-fmt}} |
|||
<lang ecmascript>import "/fmt" for Fmt |
|||
class Mwriter { |
|||
construct new(value, log) { |
|||
_value = value |
|||
_log = log |
|||
} |
|||
value { _value } |
|||
log {_log} |
|||
log=(value) { _log = value } |
|||
bind(f) { |
|||
var n = f.call(_value) |
|||
n.log = _log + n.log |
|||
return n |
|||
} |
|||
static unit(v, s) { Mwriter.new(v, " %(Fmt.s(-17, s)): %(v)\n") } |
|||
} |
|||
var root = Fn.new { |v| Mwriter.unit(v.sqrt, "Took square root") } |
|||
var addOne = Fn.new { |v| Mwriter.unit(v + 1, "Added one") } |
|||
var half = Fn.new { |v| Mwriter.unit( v / 2, "Divided by two") } |
|||
var mw1 = Mwriter.unit(5, "Initial value") |
|||
var mw2 = mw1.bind(root).bind(addOne).bind(half) |
|||
System.print("The Golden Ratio is %(mw2.value)") |
|||
System.print("\nThis was derived as follows:-") |
|||
System.print(mw2.log)</lang> |
|||
{{out}} |
|||
<pre> |
|||
The Golden Ratio is 1.6180339887499 |
|||
This was derived as follows:- |
|||
Initial value : 5 |
|||
Took square root : 2.2360679774998 |
|||
Added one : 3.2360679774998 |
|||
Divided by two : 1.6180339887499 |
|||
</pre> |
</pre> |
||