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.)
from math import sqrt
from sugar import `=>`, `->`
 
type
  WriterUnit = (float, string)
  WriterBind = proc(a: WriterUnit): WriterUnit
 
proc bindWith(f: (x: float) -> float; log: string): WriterBind =
  result = (a: WriterUnit) => (f(a[0]), a[1] & log)
 
func doneWith(x: int): WriterUnit =
  (x.float, "")
 
var
  logRoot = sqrt.bindWith "obtained square root, "
  logAddOne = ((x: float) => x+1'f).bindWith "added 1, "
  logHalf = ((x: float) => x/2'f).bindWith "divided by 2, "
 
echo 5.doneWith.logRoot.logAddOne.logHalf
 