[Haskell-cafe] Type trickery

wren ng thornton wren at freegeek.org
Thu Mar 17 06:09:45 CET 2011


On 3/16/11 9:52 AM, Andrew Coppin wrote:
>>> Hmm, yes. That will work, but I wonder if there's some way of doing this
>>> that doesn't limit the scope of the container to one single span of
>>> code...
>>
>> You can write helper functions which take containers as argument by
>> parameterizing these helper functions over s:
>>
>> takesTwoContainers :: Container s1 -> Container s2 -> ...
>> takesTwoContainers c1 c2 = ... -- c1 and c2 can be used here
>>
>> This function could be called like this:
>>
>> withContainer (\c1 ->
>> withContainer (\c2 ->
>> takesTwoContainers c1 c2)) -- c1 and c2 can be used here
>>
>> In this example, the scope of the containers is not limited to a single
>> span of code.
>
> What you can't do is write functions such as
>
> foo :: Container x -> (Cursor x, Cursor x)
>
> for example.

     -- ?
     foo cx = (curse cx, curse cx)


> Perhaps this property is just too tricky to check in the type system.
> It's quite possible to check it at run-time; I'd just prefer to check at
> compile-time, if it's not too difficult to implement.

It sounds like you want something based on "memory regions". The ST 
monad uses a restricted version of regions, but there are more general 
versions which allow for comparing region names for equality etc (as 
opposed to ST where the existential quantification requires the types to 
unify or be unequal). Try googling around.

-- 
Live well,
~wren



More information about the Haskell-Cafe mailing list