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
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe