Another option which allows you to define your own key type is the 
dependent-map[1] package.  It requires implementing some classes for your key 
type that encode a proof that key equality entails equality of the type 
indices. If the documentation is insufficient feel free to ask me for more 
details or examples.

[1] http://hackage.haskell.org/package/dependent-map

On Jul 31, 2012, at 6:56 AM, Alexander Foremny <alexanderfore...@gmail.com> 
wrote:

> At first glance I noticed some problems with the vault library for my
> particular approach.
> 
> Despite from being unique, Key values don't appear to carry any
> information like the Label I need. However, it might be possible to
> work around that.
> 
> The more grave problem seems to be that a Key cannot be
> (de-)serialized. This might be impossible due to the type parameter a
> in Key a.
> However, it is no problem to fix the types of values to some finite 
> collection.
> 
> Because of this some solution built around Dynamic seems to be more
> and more appropriate. But I'll try to investigate vault further.
> 
> Regards,
> Alexander Foremny
> 
> 2012/7/31 Alexander Foremny <alexanderfore...@gmail.com>:
>> Dear Michael,
>> 
>> thank you very much for your quick and interesting response. This
>> looks very much like what I want!
>> 
>> Regards,
>> Alexander Foremny
>> 
>> 2012/7/31 Michael Snoyman <mich...@snoyman.com>:
>>> On Tue, Jul 31, 2012 at 1:13 PM, Alexander Foremny
>>> <alexanderfore...@gmail.com> wrote:
>>>> Hello list,
>>>> 
>>>> I am currently thinking that a problem of mine would best be solved if
>>>> there was a Map-like data structure in which the value returned is
>>>> parametrized over the lookup type.
>>>> 
>>>> I wonder is this makes sense and if such a data structure exists or if
>>>> it could be created while still being well typed. I essentially want
>>>> to statically define a scope of Key values and dynamically define a
>>>> list of keys.
>>>> 
>>>>> -- Scope of possible keys.
>>>>> type Label = String
>>>>> data Key a where
>>>>>    KeyStr :: Label -> Key String
>>>>>    KeyInt :: Label -> Key Int
>>>>>    KeyChoice :: Label -> [a] -> Key a
>>>> 
>>>>> -- Some key values, to be extended at runtime.
>>>>> strKey "Some String"
>>>>> strKey' "Another String"
>>>>> intKey "Some integer"
>>>>> choiceKey "Chose one" [ "a", "b", "c" ] :: KeyChoice String
>>>> 
>>>> Now I need a data structure to possibly associate a value to the key.
>>>> 
>>>>> data MapG = ...
>>>>> type Value a = a
>>>>> insert :: Key a -> Value a -> MapG Key Value -> MapG Key Value
>>>>> lookup :: Key a -> MapG Key Value -> Maybe (Value a)
>>>> 
>>>> I tried implementing this with multiple Map k a's. I tried adding a
>>>> phantom type on some storage type of to implement KeyChoice as of type
>>>> Key Int, but I ran into troubles with this approach. I wonder if
>>>> Dynamic or Type Families could achieve this, but I am quite at a loss
>>>> and would like to hear your opinion.
>>>> 
>>>> I did try to search for this a bit, but I don't quite know how to
>>>> phrase my problem. I'd like to apologize in advance if this question
>>>> has been asked already.
>>>> 
>>>> Regards,
>>>> Alexander Foremny
>>>> 
>>>> _______________________________________________
>>>> Haskell-Cafe mailing list
>>>> Haskell-Cafe@haskell.org
>>>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>> 
>>> I think you might be looking for something like vault[1].
>>> 
>>> HTH,
>>> Michael
>>> 
>>> [1] http://hackage.haskell.org/package/vault
> 
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe@haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
> 

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to