2012-03-08 48 views
1

我正在试验基于HList的基于类型的异构列表。HList成员的自动HEQ实例

我已经定义如下:

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 

有什么办法可以使这种情况发生N +

回答

4

有几种风味的HList标签。您正尝试使用自己的'ATag'和'BTag'幻影作为标签。您使用的HList风味预计将其'HNat'类型作为标签:'HZero'和'HSucc *'。

您需要将Data.HList.Label1之一导入到Label5模块。你需要选择一个TypeEq风味,这种风味类型转换以匹配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