Автоматические экземпляры HEq для членов HList - PullRequest
1 голос
/ 08 марта 2012

Я экспериментирую с HList типизированными гетерогенными списками.

Я определил следующее:

import Data.HList

data ATag
data BTag

type TagList = ATag :*: BTag :*: HNil

bIndex :: Int
bIndex = hNat2Integral (hFind (undefined :: BTag) (undefined :: TagList))

Я ожидал, что bIndex будет иметь значение 1. Вместо этого я получаю следующую ошибку:

  No instances for (HEq BTag ATag b,
                    HFind' b BTag (HCons BTag HNil) n0)
  arising from a use of `hFind'

Похоже, что GHC (7.4.1) не может автоматически определить экземпляр

  HEq BTag ATag HFalse

Есть ли способ сделать это?

1 Ответ

4 голосов
/ 08 марта 2012

Существует несколько разновидностей этикеток HList.Вы пытаетесь использовать свои собственные фантомы «ATag» и «BTag» в качестве меток.Используемый вами вариант HList ожидает его типы 'HNat' в качестве меток: 'HZero' и 'HSucc *'.

Вам необходимо импортировать один из модулей Data.HList.Label1 в Label5.И вам нужно будет выбрать аромат TypeEq и аромат TypeCast, чтобы он соответствовал вкусу TypeEq:

{-# LANGUAGE TypeOperators #-}

import Data.HList
import Data.HList.Label5
import Data.HList.TypeCastGeneric1
import Data.HList.TypeEqGeneric1

data ATag
data BTag

type TagList = ATag :*: BTag :*: HNil

bIndex :: Int
bIndex = hNat2Integral (hFind (undefined :: BTag) (undefined :: TagList))

Вышеприведенный код работает и присваивает 'bIndex' значение 1.

...