找到两个列表中最高的数量 - haskell

时间:2016-02-26 03:45:43

标签: list function haskell

merge :: [a] -> [a] -> [a]

merge xs     []     = xs

merge []     ys     = ys

merge (x:xs) (y:ys) = x : y : merge xs ys

maxOfTwoLists  [x] [y]  = maximum (merge [x] [y])

我正在尝试合并两个列表,然后在单个列表中找到最大值。它会编译但是当我调用maxOfTwoLists时,它会给我一个非详尽的模式错误。我的合并返回单个列表就好了,最多只需要一个列表。所以觉得应该有效。

2 个答案:

答案 0 :(得分:1)

正如@badcook所说,模式匹配并不合适。

merge :: [a] -> [a] -> [a]
merge xs [] = xs
merge [] ys = ys
merge (x:xs) (y:ys) = x : y : merge xs ys

maxOfTwoLists :: (Ord a) => [a] -> [a] -> a
maxOfTwoLists [] ys = maximum ys
maxOfTwoLists xs [] = maximum xs
maxOfTwoLists xs ys = maximum (merge xs ys)

我猜您将merge函数编写为练习,但您也可以使用++中的Prelude将一个列表附加到另一个列表。

maxOfTwoLists :: (Ord a) => [a] -> [a] -> a
maxOfTwoLists xs ys = maximum (xs ++ ys)

输出:

λ> maxOfTwoLists [1,2,3] [4,5,6]
6
λ> maxOfTwoLists [1,2,3] []
3
λ> maxOfTwoLists [] [1,2,3]
3
λ> 

答案 1 :(得分:1)

如果您要合并两个列表,内置concat会有所帮助。它会使列表变平,因此我们可以执行以下操作:

maxOfTwoLists :: (Ord a) => [a] -> [a] -> a
maxOfTwoLists xs ys = maximum $ concat [xs,ys]

其中,$表示在将右侧函数应用于左侧函数之前评估它的结果。