Advertisement
TheFaceTakt

monad writer factorial

Apr 30th, 2016
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 0.75 KB | None | 0 0
  1. let wReturn (x: 'a) : ('a * string) = (x, " got " + x.ToString() + ".")
  2. let wReturnFrom (x: 'a * string) : 'a * string = x
  3. let wBind (mx: ('a * string)) (f: 'a -> 'b * string) : 'b * string =
  4.     let res = f (fst mx)
  5.     (fst res, snd mx + snd res)
  6.                                                        
  7. let (>>=) = wBind
  8.  
  9. type WriterMonad() =
  10.     member x.Bind(p, f) = wBind p f
  11.     member x.Return(y) = wReturn y
  12.     member x.ReturnFrom(y) = wReturnFrom y
  13.  
  14.  
  15. let rec f n = writer {
  16.     if n = 1 then
  17.         return 1
  18.     else
  19.         let! f_prev = f (n - 1)
  20.         let! cur = mult n f_prev
  21.         return cur
  22. }
  23.  
  24.  
  25. let rec fact n =
  26.     if (n = 1) then
  27.         wReturn 1
  28.     else
  29.         (fact (n - 1)) >>= (mult n) >>= wReturn
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement