List Haskell-将一个列表拆分为多个列表
给定已排序的元组列表,返回一个包含元组列表的列表,其中每个元组列表都符合以下条件: 1) 对于元组列表中的每个(a,b)和(c,d),a==c 2) 每个元组的第二个元素必须是前一个+1,因此对于[(a,y1),(b,y2),(c,y3)]=>y2=y1+1;y3=y2+1 例如: 输入 ex=[(0,2)、(1,0)、(1,2)、(1,3)、(1,4)、(2,4)] 输出 groupTogether ex=[(0,2)],[(1,0)],[(1,2),(1,3),(1,4)],[(2,4)]] 这必须使用fold实现 我的实施:List Haskell-将一个列表拆分为多个列表,list,haskell,fold,List,Haskell,Fold,给定已排序的元组列表,返回一个包含元组列表的列表,其中每个元组列表都符合以下条件: 1) 对于元组列表中的每个(a,b)和(c,d),a==c 2) 每个元组的第二个元素必须是前一个+1,因此对于[(a,y1),(b,y2),(c,y3)]=>y2=y1+1;y3=y2+1 例如: 输入 ex=[(0,2)、(1,0)、(1,2)、(1,3)、(1,4)、(2,4)] 输出 groupTogether ex=[(0,2)],[(1,0)],[(1,2),(1,3),(1,4)],[(2,4)]]
groupTogether :: [(Integer,Integer)]-> [[(Integer,Integer)]]
groupTogether [] = []
groupTogether pairs@(x:xs) = foldr (\(a,b) acc -> if ( (a == fst(last(last(acc)))) && (b == fst(last(last(acc)))) )
then (a,b) : (last(last(acc)))
else [(a,b)] : ((last(acc)))
) [[]] pairs
我得到的错误是:
在
[(a,b)] : last acc
我们有:
acc :: [[(Integer, Integer)]] -- presumed
last acc :: [(Integer, Integer)]
[(a,b)] :: [(Integer, Integer)]
acc :: [[(Integer, Integer)]] -- presumed
last acc :: [(Integer, Integer)]
last (last acc) :: (Integer, Integer)
(a,b) :: (Integer, Integer)
因此,[(a,b)]
具有作为[(整数,整数)]]
的第一个元素的正确类型,但是最后一个acc
没有作为[(整数,整数)]]
的尾部的正确类型
在
我们有:
acc :: [[(Integer, Integer)]] -- presumed
last acc :: [(Integer, Integer)]
[(a,b)] :: [(Integer, Integer)]
acc :: [[(Integer, Integer)]] -- presumed
last acc :: [(Integer, Integer)]
last (last acc) :: (Integer, Integer)
(a,b) :: (Integer, Integer)
因此(a,b)
没有正确的类型作为[[(整数,整数)]]
的第一个元素,而最后一个(最后一个acc)
没有正确的类型作为[[(整数,整数)]]
的尾部
我把修理工作留给你;希望这能充分阐明错误的含义,使您能够取得进展。
我们有:
acc :: [[(Integer, Integer)]] -- presumed
last acc :: [(Integer, Integer)]
[(a,b)] :: [(Integer, Integer)]
acc :: [[(Integer, Integer)]] -- presumed
last acc :: [(Integer, Integer)]
last (last acc) :: (Integer, Integer)
(a,b) :: (Integer, Integer)
因此,[(a,b)]
具有作为[(整数,整数)]]
的第一个元素的正确类型,但是最后一个acc
没有作为[(整数,整数)]]
的尾部的正确类型
在
我们有:
acc :: [[(Integer, Integer)]] -- presumed
last acc :: [(Integer, Integer)]
[(a,b)] :: [(Integer, Integer)]
acc :: [[(Integer, Integer)]] -- presumed
last acc :: [(Integer, Integer)]
last (last acc) :: (Integer, Integer)
(a,b) :: (Integer, Integer)
因此(a,b)
没有正确的类型作为[[(整数,整数)]]
的第一个元素,而最后一个(最后一个acc)
没有正确的类型作为[[(整数,整数)]]
的尾部
我把修理工作留给你;希望这能充分阐明错误的含义,以便您能够取得进展。请注意,使用
foldr
时,将首先处理给定列表的右侧元素。例如,列表:
[(0,2),(1,0),(1,2),(1,3),(1,4),(2,4)]
当处理第三个元素(1,2)
时,处理的元素,即acc
acc = [[(1,3),(1,4)],[(2,4)]]
因此,需要与(1,2)
进行比较的元素是(1,3)
。即head(head acc)
不是last(last acc)
。此外,不使用头部
,它可以通过模式匹配访问,如下所示:
(pairs@((x, y):xs):xss)
并与(a,b)
进行比较:
如果满足条件,则将其分组:
((a, b):pairs):xss
此外,定义step函数而不是使用匿名函数更具可读性,因为它需要处理最右边的空列表元素,如下所示:
step p [] = [[p]]
处理完第一个元素后,acc=[[p]]
将在后续步骤中永远不为空列表,从而匹配上面定义的模式。以下是如何定义step函数:
groupTogether = foldr step []
where step p [] = [[p]]
step p@(a, b) acc@(pairs@((x, y):xs):xss)
| a == x && b == (y - 1) = (p:pairs):xss
| otherwise = [p]:acc
了解foldr
如何操作时,步进功能是直接的。最后,作为旁注,声明:
groupTogether [] = []
没有必要。由于将空列表传递给
groupTogether
时foldr
将返回其第二个参数,因此在本例中,返回[]
请注意,使用foldr
时,将首先处理给定列表的右侧元素。例如,列表:
[(0,2),(1,0),(1,2),(1,3),(1,4),(2,4)]
当处理第三个元素(1,2)
时,处理的元素,即acc
acc = [[(1,3),(1,4)],[(2,4)]]
因此,需要与(1,2)
进行比较的元素是(1,3)
。即head(head acc)
不是last(last acc)
。此外,不使用头部
,它可以通过模式匹配访问,如下所示:
(pairs@((x, y):xs):xss)
并与(a,b)
进行比较:
如果满足条件,则将其分组:
((a, b):pairs):xss
此外,定义step函数而不是使用匿名函数更具可读性,因为它需要处理最右边的空列表元素,如下所示:
step p [] = [[p]]
处理完第一个元素后,acc=[[p]]
将在后续步骤中永远不为空列表,从而匹配上面定义的模式。以下是如何定义step函数:
groupTogether = foldr step []
where step p [] = [[p]]
step p@(a, b) acc@(pairs@((x, y):xs):xss)
| a == x && b == (y - 1) = (p:pairs):xss
| otherwise = [p]:acc
了解foldr
如何操作时,步进功能是直接的。最后,作为旁注,声明:
groupTogether [] = []
没有必要。由于将空列表传递给
groupTogether
时,foldr
将返回其第二个参数,因此在本例中,返回[]
这是一个家庭作业问题吗?@PeterHall这真的重要吗?我发布了我的努力,试图解决这个问题,这并不是说我只是想要实现,而没有试图解决它first@PeterHall回答你的问题,不,这不是家庭作业。。事实上,这并不重要;如果这是一个好问题,那么不管它的家庭作业状态如何,它都是一个好问题。@MichaelLitchard不过,谢谢你分享你投反对票的原因,而不仅仅是投反对票。这是一个家庭作业问题吗?@PeterHall这真的重要吗?我发布了我的努力,试图解决这个问题,这并不是说我只是想要实现,而没有试图解决它first@PeterHall回答你的问题,不,这不是家庭作业。。事实上,这并不重要;如果这是一个好问题,那么不管它的家庭作业状况如何,它都是一个好问题。@MichaelLitchard不过,谢谢你分享你投反对票的原因,而不仅仅是投反对票。谢谢,对于答案,我投了赞成票,但不会接受它作为答案,因为它是部分答案。谢谢,对于答案,我投了赞成票,但不会接受它作为一个答案,因为它是一个部分答案。