如何通过Haskell中的列表处理递归(转置操作)

时间:2019-01-04 09:08:42

标签: list haskell recursion transpose non-exhaustive-patterns

虽然我了解Haskell中可能有转置或ZipList函数,但我正在尝试构建自己的转置函数,该函数将接受等长 m n 个列表,将它们转换为长度为 n m 个列表。

到目前为止,我的功能几乎可以使用以下代码:

list = [[1,2,3],[4,5,6],[7,8,9]]

head' (x:xs) = x

head'' [] = []
head'' (xs:lxs) = head' xs:head'' lxs

tail' [] = []
tail' (x:xs) = xs

tail'' [] = []
tail'' (xs:lxs) = tail' xs:tail'' lxs

merge (xs:lxs) = (head' xs:head'' lxs):(merge (tail' xs:tail'' lxs))

当我在ghci中运行> merge list时,得到以下输出:

[[1,4,7],[2,5,8],[3,6,9],[*** Exception: list2.hs:16:1-16: Non-exhaustive patterns in function head'

我敢肯定,这意味着我的head'函数中空列表的基本情况丢失了。该列表已转置,只是未关闭。在这种情况下,我该如何处理?我有点怀疑它可能与Maybe有关,但是我很难以这种方式实现它。

2 个答案:

答案 0 :(得分:1)

您需要添加退出条件:

merge [] = []
merge ([]:xss) = merge xss

答案 1 :(得分:0)

除了现有的maphead函数之外,您还需要

tail。为简单起见,这里假设输入始终是一个非空列表(即xs可能是[[],[],[]],但永远不会单独是[],因此使用{{1}没问题}或head。)

tail