[MLton] Monadic MLton.Vector.create
Daniel C. Wang
danwang@CS.Princeton.EDU
Tue, 28 Mar 2006 21:28:48 -0800
Oh, never mind. I just figured out a counter example. :( You can use a
closure to encapsulate the key
val upd = ref (fn(x:int,y:int) => ())
fun evil {key,sub,update} = let
fun f(x,y) = update(key,x,y)
in
upd := f
end
now if we could only bad higher-order functions we'd be set :)
Daniel C. Wang wrote:
> Just a thought, but can you use the value restriction to your
> advantage here? I mean you can't store a polymorphic value into a ref
> cell. Can sub and update be given types too polymorphic to stash away?
>
> |val create: int * 'a * ({key: 'b,
> sub: 'b * int -> 'a,
> update: 'b * int * 'a -> unit} -> unit) -> 'a
> vector |
>
> Unless, I'm missing something there's no way for sub,update, or key to
> escape the scope of create. I think a similar argument has been made
> for certain monads in Haskell, but my memory is flakey.
>
> Vesa Karvonen wrote:
>> 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
>>
>> _______________________________________________
>> MLton mailing list
>> MLton@mlton.org
>> http://mlton.org/mailman/listinfo/mlton
>>
>
> _______________________________________________
> MLton mailing list
> MLton@mlton.org
> http://mlton.org/mailman/listinfo/mlton