Monads/Writer monad: Difference between revisions

Content added Content deleted
(Realize in F#)
Line 293: Line 293:
<lang fsharp>
<lang fsharp>
// Monads/Writer monad . Nigel Galloway: July 20th., 2022
// Monads/Writer monad . Nigel Galloway: July 20th., 2022
type Riter<'n,'g>=Riter of 'n * List<'g>
type Riter<'n>=Riter of 'n * List<string>
let bind=function |(n,g)->Riter(n,[g])
let eval=function |Riter(n,g)->(n,g)
let eval=function |Riter(n,g)->(n,g)
let compose f=function |Riter(n,g)->let n,l=eval(f n) in Riter(n,List.append g l)
let compose f=function |Riter(n,g)->let n,l=eval(f n) in Riter(n,List.append g l)
let initV(n:float)=bind(n,sprintf "Initial Value %f" n)
let initV n=Riter(n,[sprintf "Initial Value %f" n])
let sqrt n=bind(sqrt n,"Took square root")
let sqrt n=Riter(sqrt n,["Took square root"])
let div2 n=bind(n/2.0,"Divided by 2")
let div n g=Riter(n/g,[sprintf "Divided by %f" n])
let incr n=bind(n+1.0,"Added 1")
let add n g=Riter(n+g,[sprintf "Added %f" n])
let result,log=eval(initV 5.0|>compose sqrt|>compose incr|>compose div2)
let result,log=eval((initV>>compose sqrt>>compose(add 1.0)>>compose(div 2.0))5.0)
log|>List.iter(printfn "%s")
log|>List.iter(printfn "%s")
printfn "Final value = %f" result
printfn "Final value = %f" result
Line 309: Line 308:
Initial Value 5.000000
Initial Value 5.000000
Took square root
Took square root
Added 1
Added 1.000000
Divided by 2
Divided by 2.000000
Final value = 1.618034
Final value = 0.618034
</pre>
</pre>

=={{header|Factor}}==
=={{header|Factor}}==
Factor comes with an implementation of Haskell-style monads in the <code>monads</code> vocabulary.
Factor comes with an implementation of Haskell-style monads in the <code>monads</code> vocabulary.