Haskell添加两个列表模式匹配

nob*_*ody 6 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
Run Code Online (Sandbox Code Playgroud)

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

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

我做错了什么?

谢谢

Car*_*ten 14

请注意,如果列表大小不同,您仍然会遇到"非详尽模式匹配"的问题!这是一个适用于所有情况的解决方案:

addList [] _ = []
addList _ [] = []
addList (a:as) (b:bs) = (a+b) : addList as bs
Run Code Online (Sandbox Code Playgroud)

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

最后要注意的是:在GHCi中编写多行定义很痛苦 - 在一些编辑器中将它们写入.hs文件:load MyFile.hs:reload在GHCi中使用


sep*_*p2k 13

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

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

let addlist [] [] = []; addlist (a:as) (b:bs) = (a+b) : addlist as bs
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这将解决您手头的GCHi问题,但会因不同大小的列表而失败 (4认同)