The Writer monad is a programming design pattern which makes it possible to compose functions which return their result values paired with a log string. The final result of a composed function yields both a value, and a concatenation of the logs from each component function application.

Demonstrate in your programming language the following:

 Construct a Writer monad by writing the 'bind' function and the 'unit' (sometimes known as 'return') function for that monad (or just use what the language already provides)
 Write three simple functions: root, addOne, and half
 Derive Writer monad versions of each of these functions
 Apply a composition of the Writer versions of root, addOne, and half to the integer 5, deriving both a value for the Golden Ratio φ, and a concatenated log of the function applications (starting with the initial value, and followed by the application of root, etc.)
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)