1

HListベースの型指定された異種リストを試しています。

以下を定義しました。

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

1 に答える 1

4

HList のラベルにはいくつかの種類があります。独自の 'ATag' および 'BTag' ファントムをラベルとして使用しようとしています。使用している HList フレーバーは、その 'HNat' 型をラベルとして期待しています: 'HZero' および 'HSucc *'。

Data.HList.Label1 から Label5 モジュールのいずれかをインポートする必要があります。TypeEq フレーバーと、TypeEq フレーバーに一致する TypeCast フレーバーを選択する必要があります。

{-# 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 を与えます。

于 2012-03-08T10:14:32.397 に答える