列出更高类型的实例
List Instances for higher-kinded types
如果我有一个 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 扩展,但我想要一些比文字更有效的东西。
也许你可以改变你的类型 class 由完全应用的字典类型索引,而不是类型构造函数 * -> * -> *
:
{-# 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 = ...
如果我有一个 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 扩展,但我想要一些比文字更有效的东西。
也许你可以改变你的类型 class 由完全应用的字典类型索引,而不是类型构造函数 * -> * -> *
:
{-# 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 = ...