Список экземпляров для типов с более высоким родом - PullRequest
0 голосов
/ 30 ноября 2018

Если у меня есть 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, но мне бы хотелось что-то, что работает на вещи больше, чем литералы.

1 Ответ

0 голосов
/ 30 ноября 2018

Возможно, вы можете изменить свой класс типов для индексации по полностью примененному типу словаря вместо конструктора типов * -> * -> *:

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