如果我有MultiParamTypeClass,请说Dictionary a k v
(无论如何,它是* -> * -> *
),我想为列表创建一个实例(即[(k,v)]
),这可能吗?
我发现编译器抱怨[(k,v)]
只是种类*
,但可以使此列表(在此示例中为关联列表)的行为类似于Pair k v
,但仍然能够使用Haskell的列表类型?
在代码中,
class Dictionary a where
method :: Thing k v -> a k v
我想组建
instance Dictionary [(k,v)] where
method = ...
可以做到吗?我意识到这里有OverloadedLists扩展名,但我希望某些东西比文字更有用。
答案 0 :(得分:5)
也许您可以将类型类更改为通过完全应用的字典类型而不是类型构造函数* -> * -> *
进行索引:
{-# LANGUAGE TypeFamilies, FlexibleInstances #-}
class Dictionary d where
type Key d :: Type
type Value d :: Type
f :: Thing (Key d) (Value d) -> d
instance Dictionary [(k, v)] where
type Key [(k, v)] = k
type Value [(k, v)] = v
f = ...
instance Dictionary (Map k v) where
type Key (Map k v) = k
type Value (Map k v) = v
f = ...