我正在尝试基于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
有没有办法让这种情况发生?
答案 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。