我有签名
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]由于某种原因不起作用
答案 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 -> ???
我认为你可以弄清楚在不同情况下该怎么做......