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
时,它会给我一个非详尽的模式错误。我的合并返回单个列表就好了,最多只需要一个列表。所以觉得应该有效。
答案 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]
其中,$
表示在将右侧函数应用于左侧函数之前评估它的结果。