列出更高类型的实例

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 = ...