如果我有一个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扩展,但我想要的东西比文字更有效。
也许您可以将您的类型类更改为完全应用的字典类型,而不是类型构造函数* -> * -> *
:
{-# 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 = ...