[MLton] Monadic MLton.Vector.create
   
    Vesa Karvonen
     
    vesa.karvonen@cs.helsinki.fi
       
    Wed, 29 Mar 2006 01:08:14 +0300
    
    
  
Quoting Henry Cejtin <henry.cejtin@sbcglobal.net>:
[...]
> The only ugliness to me in the create proposal is the fact  that  update  and
> sub might be squirreled away, so you have to make them raise Fail if they are
> called after create returns.  It would be nice if one could make it  so  that
> they  couldn't  be  in scope or saved any where, but I don't see any way that
> isn't REALLY convoluted and ugly.
[...]
Were you thinking about monads?  Here is a suitable signature for create:
signature CREATE =
   sig
      type 'a m
      val create : int -> (int -> 'a m) -> 'a vector
      val >>= : 'a m * ('a -> 'b m) -> 'b m
      val return : 'a -> 'a m
      val sub  : int -> 'a m
      val update : int * 'b -> unit m
   end
The below functor implements the same fib function as in Stephen's
earlier post.
functor Fib (C : CREATE) =
   struct
      local
         open C
         infix >>=
      in
      fun fib i =
          create i (fn i =>
                       if i <= 1 then
                          return i
                       else
                          sub (i-1) >>= (fn x =>
                          sub (i-2) >>= (fn y =>
                          return (x+y))))
      end
   end
I wouldn't call it "ugly", but YMMV.
-Vesa Karvonen