【发布时间】:2016-06-18 19:55:10
【问题描述】:
我正在学习 Haskell,想编写函数来递归处理任意深度嵌套的列表。
例如,我想写recurReverse,在基本情况下,它的作用就像内置的reverse,但是当传递一个嵌套列表时,reverse 子列表的所有元素递归为好吧:
recurReverse [1,2]
>> [2,1]
recurReverse [[1],[2],[3,4]]
>> [[4,3],[2],[1]]
recurReverse [[[1,2]]]
>> [[[2,1]]]
目前我有基本的reverse down:
rev [] = []
rev (h:t) = rev t ++ [h]
但我需要的不止这些——如果头部 h 也是一个列表(而不是 LISP 意义上的原子),我希望能够 reverse h以及返回类似rev t ++ [rev h] 的内容。当我尝试这样做时,我得到一个编译器错误,说我不能rev h,因为rev 是[t] -> [t] 类型,但我试图在t 类型上调用它,这是有道理的。我该如何解决这个问题?
【问题讨论】:
-
归根结底,您需要为列表编写一个类型,该类型在类型级别对嵌套深度进行编码,以便您可以编写不在 list 上的递归函数 但在 嵌套深度 上。可能最简单的方法是使用类型族。
标签: list haskell recursion types