列出更高级别类型的实例

问题描述 投票:0回答:1

如果我有一个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扩展,但我想要的东西比文字更有效。

haskell typeclass
1个回答
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 = ...
© www.soinside.com 2019 - 2024. All rights reserved.