2016-02-26 26 views
2
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

您的'maxOfTwoLists'模式匹配两个列表中的一个元素,每个 – badcook

+0

ahhh有意义。我如何使它匹配整个列表? – LukeshotFirst

+0

删除方括号(在参数和函数体中) – badcook

回答

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 
λ> 
+3

如果您打算使用'++',请不要打扰'[]'个案的模式。第三种情况本身就很多。 – amalloy

+0

使用'merge'时也是如此:由于merge是处理空列表,因此不需要处理空列表。 (当然,如果两个列表都是空的,'maximum'仍然会引发异常) – chi

+1

我知道这是一个解决方案!我只是哈斯克尔的新手。非常感谢! – LukeshotFirst

1

如果你正在寻找合并两个列表,内建concat会有所帮助。它变平的列表,所以我们可以做到以下几点:

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

其中,$意味着其应用到左侧功能之前评估右侧函数的结果。

+0

$符号稍后也会有用。非常感谢你。 – LukeshotFirst