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
包含非空列表。如果你继续在列表上映射尾部,最终,其中一个元素将是一个空列表。