HList成员的自动HEq实例

时间:2012-03-08 07:01:13

标签: haskell types hlist

我正在尝试基于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 个答案:

答案 0 :(得分:4)

有几种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))

以上作品并给出了指数'值1。