List Haskell列表有问题吗

List Haskell列表有问题吗,list,haskell,head,List,Haskell,Head,我不知道这是怎么回事。 我有一张单子 L=[[1,2,3],[4,5,6],[7,8,9]] 我需要一个函数,它能给我这个: L=[[1,4,7],[2,5,8],[3,6,9]] 到目前为止,我有以下几点: rotar2 [ ] = [ ] rotar2 l = [map head l] ++ rotar2(map tail l) 它是有效的,但根本不起作用。。 它向我发送了以下错误: [[1,4,7],[2,5,8],[3,6,9],[ 程序错误:模式匹配失败:头[] 我该怎么办?您正在重

我不知道这是怎么回事。 我有一张单子
L=[[1,2,3],[4,5,6],[7,8,9]]

我需要一个函数,它能给我这个:
L=[[1,4,7],[2,5,8],[3,6,9]]

到目前为止,我有以下几点:

rotar2 [ ] = [ ]
rotar2 l = [map head l] ++ rotar2(map tail l)
它是有效的,但根本不起作用。。 它向我发送了以下错误:

[[1,4,7],[2,5,8],[3,6,9],[
程序错误:模式匹配失败:头[]


我该怎么办?

您正在重复获取函数输入中每个列表的头和尾。最终,其中一个列表将只剩下空列表作为尾,尝试获取该空列表的头将失败

  rotar2 [[1,2,3],[4,5,6],[7,8,9]]
    = [[1,4,7]] ++ rotar2 [[2,3], [5,6], [8,9]]
    = [[1,4,7]] ++ [[2,5,8]] ++ rotar2 [[3], [6], [9]]
    = [[1,4,7]] ++ [[2,5,8]] ++ [[3,6,9]] ++ rotar2 [[],[],[]]
    = [[1,4,7]] ++ [[2,5,8]] ++ [[3,6,9]] ++ [head [],head[],head []] ++ ...
    = [[1,4,7],[2,5,8],[3,6,9],[⊥,⊥,⊥],...]
转置 您试图定义的函数
rotar2
通常称为
transpose
,可以直接实现为

transpose :: [[a]] -> [[a]]
transpose []         = repeat []
transpose (xs : xss) = zipWith (:) xs (transpose xss)
其思想是,一个非空的列表列表,比如说
[[1,2,3],[4,5,6],[7,8,9]
,可以通过先将其尾部
[[4,5,6],[7,8,9]
,产生
[[4,7],[5,8],[6,9]
,然后将头部列表的元素
[1,2,3]
前置到被转换的尾部的元素来进行归纳转换:

[ 1 : [4,7] , 2 : [5,8] , 3 : [6,9] ]
因此:

> transpose [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[[1,4,7],[2,5,8],[3,6,9]]

在标准库中,此函数由模块导出。

您重复获取函数输入中每个列表的头和尾。最终,其中一个列表将只剩下空列表作为尾,尝试获取该空列表的头将失败

  rotar2 [[1,2,3],[4,5,6],[7,8,9]]
    = [[1,4,7]] ++ rotar2 [[2,3], [5,6], [8,9]]
    = [[1,4,7]] ++ [[2,5,8]] ++ rotar2 [[3], [6], [9]]
    = [[1,4,7]] ++ [[2,5,8]] ++ [[3,6,9]] ++ rotar2 [[],[],[]]
    = [[1,4,7]] ++ [[2,5,8]] ++ [[3,6,9]] ++ [head [],head[],head []] ++ ...
    = [[1,4,7],[2,5,8],[3,6,9],[⊥,⊥,⊥],...]
转置 您试图定义的函数
rotar2
通常称为
transpose
,可以直接实现为

transpose :: [[a]] -> [[a]]
transpose []         = repeat []
transpose (xs : xss) = zipWith (:) xs (transpose xss)
其思想是,一个非空的列表列表,比如说
[[1,2,3],[4,5,6],[7,8,9]
,可以通过先将其尾部
[[4,5,6],[7,8,9]
,产生
[[4,7],[5,8],[6,9]
,然后将头部列表的元素
[1,2,3]
前置到被转换的尾部的元素来进行归纳转换:

[ 1 : [4,7] , 2 : [5,8] , 3 : [6,9] ]
因此:

> transpose [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[[1,4,7],[2,5,8],[3,6,9]]

在标准库中,此函数由模块导出。

您可以在一行中重新定义
转置
函数:

transpose = getZipList . traverse ZipList

所有的定义和实例都在
控件.Applicative
Data.Traversable
模块中。它的定义与Stefan Holdermans answer modulo TypeClass和wrapping unwrapping stuff中的定义相同。

您可以在一行中重新定义
transpose
函数:

transpose = getZipList . traverse ZipList

所有的定义和实例都在
控件.Applicative
Data.Traversable
模块中。它的定义与Stefan Holdermans answer modulo typeclasses和wrapping unwrapping stuff中的定义相同。

您试图定义的函数随时可用-它被调用。执行
rotar2时会发生什么[[]]
?@n.m.它向我发送了相同的错误我知道它向你发送了什么,你能明白为什么吗?你在
l
上映射头部,但是没有理由仅仅因为
l
本身是非空的,就假设
l
包含非空列表。如果你继续在列表上映射尾部,最终,其中一个元素将是一个空列表。您试图定义的函数随时可用-已调用。执行
rotar2[[]时会发生什么
?@n.m.它向我发送了相同的错误我知道它向你发送了什么,你能明白为什么吗?你在
l
上映射头部,但是没有理由仅仅因为
l
本身是非空的,就假设
l
包含非空列表。如果你继续在列表上映射尾部,最终,其中一个元素将是一个空列表。