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.)
with javascript_semantics
function bind(object m, integer f)
    return f(m)
end function
 
function unit(object m)
    return m
end function
 
function root(sequence al)
    {atom a, string lg} = al
    atom res = sqrt(a)
    return {res,lg&sprintf("took root: %f -> %f\n",{a,res})}
end function
 
function addOne(sequence al)
    {atom a, string lg} = al
    atom res = a + 1
    return {res,lg&sprintf("added one: %f -> %f\n",{a,res})}
end function
 
function half(sequence al)
    {atom a, string lg} = al
    atom res = a / 2
    return {res,lg&sprintf("halved it: %f -> %f\n",{a,res})}
end function
 
printf(1,"%f obtained by\n%s", bind(bind(bind({5,""},root),addOne),half))
