所以我在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中的非详尽模式
我只是想把两个列表一起添加到一个列表中...... :(
我做错了什么?
由于
答案 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 (+)