结合haskell中的列表

时间:2011-05-28 17:16:39

标签: haskell

我有签名

combine
  :: [[a]] -> [[a]]

函数Combine从列表构建列表,(1列表可能是无穷大,如重复1),并返回列表 最长的清单,而不改变订单。

combine [] = []    
combine [[]] = [[]]    
combine [[], [1]] = [[1]]    
combine [[1], [2]] = [[1],[2]]    
combine [[], repeat 1, []] = [repeat 1] value

有什么想法吗? 谢谢 代码:
combine :: [[a]] - > [[一个]]
合并[] = []

组合((xs),[])= [xs]由于某种原因不起作用

2 个答案:

答案 0 :(得分:2)

您需要使用递归函数来解决此问题。

考虑构建累加器的递归算法 - 如果您不熟悉累加器的概念,请要求澄清。此累加器将具有类型[[a]],它与我们的函数的返回类型相同。当我们使用递归函数迭代列表列表时,如果它们与累加器中的其他列表长度相同,则我们将列表列入累加器,如果它们的长度较短,则忽略它们。但是,如果列表的长度更长,我们会废弃累加器中的所有其他内容,只保留新的更长的列表。

这模糊地描述了可用于解决此问题的线性算法。如果您想进一步澄清,请在评论中提问。

答案 1 :(得分:0)

首先,您需要一个比较功能,例如:

cmp [] [] = EQ
cmp [] _ = LT
cmp _ [] = GT  
cmp (x:xs) (y:ys) = cmp xs ys  

然后你可以使用一个辅助函数,它有一个累加器用于当前的“最大值”:

combine :: [[a]] -> [[a]]
combine [] = []
combine (x:xs) = comb xs [x] where
   comb [] acc = acc
   comb (x:xs) (y:ys) = case x `cmp` y of
                          EQ -> ???
                          LT -> ???
                          GT -> ???

我认为你可以弄清楚在不同情况下该怎么做......