1

虽然我知道 Haskell 中可能有转置或 ZipList 函数,但我正在尝试构建自己的转置函数,它将获取n个等长m的列表并将它们转置为m个长度为n的列表。

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

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))

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

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

我很确定这意味着我的head'函数中空列表的基本情况丢失了。该列表被转置,只是没有关闭。在这种情况下,我该如何处理这个问题?我有一个可能与它有关的暗示Maybe,但我无法以这种方式实现它。

4

2 回答 2

1

您需要添加退出条件:

merge [] = []
merge ([]:xss) = merge xss
于 2019-01-04T09:42:31.373 回答
0

map是你所需要的,除了现有的headtail功能。为简单起见,这假设输入始终是一个非空列表(即,xs可能是[[],[],[]],但绝不是单独的,因此使用or[]没有问题。)headtail

> map head list
[1,4,7]
> map tail list
[[2,3],[5,6],[8,9]]
> let foo xs = if null (head xs) then [] else map head xs : foo (map tail xs)
> foo list
[[1,4,7],[2,5,8],[3,6,9]]
于 2019-01-04T14:14:22.980 回答