Haskell添加两个列表模式匹配

时间:2011-09-14 07:38:53

标签: haskell pattern-matching

所以我在GHCI上有以下内容

>let addlist [] [] = []
>let addlist (a:as) (b:bs) = (a+b) : addlist as bs
>let x = [1..5]
>let y = [6..10]
>addlist x y

最后一行给了我:    [7,9,11,13,15 ***例外:: 1:5-49:函数addlist中的非详尽模式

我只是想把两个列表一起添加到一个列表中...... :(

我做错了什么?

由于

3 个答案:

答案 0 :(得分:14)

如果列表大小不同,请注意,“非详尽模式匹配”仍然存在问题!这是适用于所有情况的解决方案:

addList [] _ = []
addList _ [] = []
addList (a:as) (b:bs) = (a+b) : addList as bs

不是两个模式,其中任何一个列表都是空的!

最后一点说明:在GHCi中编写多行定义很痛苦 - 在一些编辑器中将它们写入.hs文件并在GHCi中使用:load MyFile.hs:reload

答案 1 :(得分:13)

如果你想在let内使用模式匹配来定义一个函数,你不能像你一样使用每个模式一个 - 这将简单地定义两个独立的函数(第二个映射第一个)。

你需要使用单个let并使用换行符分隔模式,或者在ghci中你不能使用换行符,分号。所以:

let addlist [] [] = []; addlist (a:as) (b:bs) = (a+b) : addlist as bs

答案 2 :(得分:3)

请注意,您有一个内置函数zipWith,用于将两个列表按元素合并到给定函数,因此您可以编写

addList xs ys = zipWith (+) xs ys

或更短

addList = zipWith (+)