Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- let wReturn (x: 'a) : ('a * string) = (x, " got " + x.ToString() + ".")
- let wReturnFrom (x: 'a * string) : 'a * string = x
- let wBind (mx: ('a * string)) (f: 'a -> 'b * string) : 'b * string =
- let res = f (fst mx)
- (fst res, snd mx + snd res)
- let (>>=) = wBind
- type WriterMonad() =
- member x.Bind(p, f) = wBind p f
- member x.Return(y) = wReturn y
- member x.ReturnFrom(y) = wReturnFrom y
- let rec f n = writer {
- if n = 1 then
- return 1
- else
- let! f_prev = f (n - 1)
- let! cur = mult n f_prev
- return cur
- }
- let rec fact n =
- if (n = 1) then
- wReturn 1
- else
- (fact (n - 1)) >>= (mult n) >>= wReturn
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement