List Haskell-将一个列表拆分为多个列表

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

给定已排序的元组列表,返回一个包含元组列表的列表,其中每个元组列表都符合以下条件:

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实现

我的实施:

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不过,谢谢你分享你投反对票的原因,而不仅仅是投反对票。谢谢,对于答案,我投了赞成票,但不会接受它作为答案,因为它是部分答案。谢谢,对于答案,我投了赞成票,但不会接受它作为一个答案,因为它是一个部分答案。