2012-03-08 51 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