2012-03-08 8 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)) 

私が代わりに値1を持つようにbIndexを期待していた、私は次のエラーを取得:

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フレーバーは、 'HNero'タイプがラベルとして '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.

関連する問題