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 |
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 |
let initV n=Riter(n,[sprintf "Initial Value %f" n]) |
||
let sqrt n= |
let sqrt n=Riter(sqrt n,["Took square root"]) |
||
let |
let div n g=Riter(n/g,[sprintf "Divided by %f" n]) |
||
let |
let add n g=Riter(n+g,[sprintf "Added %f" n]) |
||
let result,log=eval(initV |
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 = |
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. |