如何在Haskell中迭代异构递归值

men*_*ics 3 haskell

我看到了HList包,但我认为这对我需要的东西来说太过分了.

我有这个:

data a :*: b = a :*: b deriving (Show, Eq)
Run Code Online (Sandbox Code Playgroud)

我可以成功地用它来做到这一点:

prepend :: a -> b -> a :*: b
prepend a b = a :*: b
Run Code Online (Sandbox Code Playgroud)

但我希望能够以某种方式迭代"列表"并使用元素做事但不知道如何这样做.

bar*_*oap 5

HList纸还有柚子,记录纸可能是有用的,在这里.

基本的迭代是相对简单的(假设您在基本上是Prolog时很容易思考),按元素类型(或标签)匹配记录是事情变得毛茸茸的事情:根据当前要求的类型相等做一些事情OverlappingInstances,你将无法做到决定(大多数?所有?)多态类型的相等性.

在类型上匹配可能就是你需要"对元素做一些事情",这取决于什么是什么; 删除很简单,应用一个函数,其参数必须与元素类型匹配,这不是微不足道的,但是如果你可以给出元素的数字索引,那么应该可以不使用编译器扩展.

(编辑:这假定您要将第一类函数应用于列表.Rampion的答案显示了如何使用vanilla类型类轻松匹配类型,但类型类不能作为值传递.)

因此,最终可能会发现HList或葡萄柚记录毕竟不是过度杀伤.

  • 借调@ barsoap的建议.如果您确实需要可扩展性,则可能难以比HList更简单.HList文件(或肯定是草案)评论说,在类型级别列表中使用Nil比忽略它更容易.定义:*:在问题中只是对,因此没有Nil. (2认同)