列出更高级别类型的实例

And*_*wie 0 haskell typeclass

如果我有一个MultiParamTypeClass,说Dictionary a k v(无论什么,它的类型是什么* -> * -> *),我想为列表(即[(k,v)])创建一个实例,这可能吗?

我得知编译器抱怨这[(k,v)]只是一种,*但有可能使这个列表(在这个例子中是一个关联列表)表现得像Pair k v但仍然能够使用Haskell的列表类型?

在代码中,

class Dictionary a where
    method :: Thing k v -> a k v
Run Code Online (Sandbox Code Playgroud)

我想形成

instance Dictionary [(k,v)] where
    method = ...
Run Code Online (Sandbox Code Playgroud)

可以这样做吗?我意识到有OverloadedLists扩展,但我想要的东西比文字更有效.

Li-*_*Xia 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 = ...
Run Code Online (Sandbox Code Playgroud)