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

그 방법을 찾을 수 있습니까? 엔?

답변

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.

관련 문제