1

我正在试验基于HList的类型化异构列表。

我已经定义了以下内容:

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

有没有办法做到这一点?

4

1 回答 1

4

HList 的标签有多种风格。您正在尝试使用自己的“ATag”和“BTag”幻象作为标签。您使用的 HList 风格需要将其“HNat”类型作为标签:“HZero”和“HSucc *”。

您需要将其中一个 Data.HList.Label1 导入到 Label5 模块。您将需要选择 TypeEq 风格和 TypeCast 风格以匹配 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。

于 2012-03-08T10:14:32.397 回答