[Haskell-cafe] Data polymophism

Phlex Phlex at telenet.be
Sat Jun 9 05:41:53 EDT 2007


Thanks to both Christian and Tomasz.
This whole thing seems a bit too hard for the intended purpose.
After much tries and errors, I think i'll go for closures returning 
DbIndex items.

Something like this :

uniqueIndex bkf datas =
  DbIndex{dbiInsertIndex=insertIndex, {- more methods -}}
  where index = UniqueIndex bkf datas
        insertIndex id item = do newIndex <- uniqueIndexInsert item index
                                 return $ uniqueIndex bkf $ uiItems newIndex
        -- more functions
                                
multiIndex bkf datas =
  DbIndex{dbiInsertIndex=insertIndex, {- more methods -}}
  where index = MultiIndex bkf datas
        insertIndex id item = do newIndex <- multiIndexInsert id item index
                                 return $ multiIndex  bkf $ miItems newIndex
        -- more functions

This keeps the definitions related to each index type close together, 
and allows for extention by adding new index types later on. Actually I 
don't even need the MultiIndex and UniqueIndex types anymore, making the 
code even shorter.

Thanks for your time,
Sacha


Tomasz Zielonka wrote:
> On Fri, Jun 08, 2007 at 07:49:20PM +0200, Tomasz Zielonka wrote:
>   
>> On Fri, Jun 08, 2007 at 05:23:23PM +0200, Phlex wrote:
>>     
>>> But i don't seem to find a way to get out of this DbIndex type to 
>>> actually work on the enclosed index.
>>>
>>> for instance, this doesn't work:
>>> liftDbIndex (DbIndex index) fun = DbIndex (fun index)
>>>       
>> The compiler probably can't infer higher-ranker types, so you have to
>> write you type signature explicitly. Try:
>>
>>     liftDbIndex :: Index_ i2 a2 k2 =>
>>                    (forall a1 k1 i1. Index_ i1 a1 k1 => i1 -> i2) -> DbIndex -> DbIndex
>>     
>
> Now I think that this type signature will be too restrictive. Ideally, i2, a2 and
> k2 would be existentially quantified, like
>
>     liftDbIndex :: (forall a1 k1 i1. Index_ i1 a1 k1 => i1 -> (exists. Index_ i2 a2 k2 => i2)) ->
>                    DbIndex -> DbIndex
>
> AFAIK such type isn't supported by any Haskell compiler, so we have to
> use the existential quantification from DbIndex:
>
>     liftDbIndex :: (forall a1 k1 i1. Index_ i1 a1 k1 => i1 -> DbIndex) -> DbIndex -> DbIndex
>     liftDbIndex f (DbIndex i) = f i
>
> Best regards
> Tomek
>
>
>   


More information about the Haskell-Cafe mailing list