我对Haskell相对较新(第三天学习语言)并且遇到模式匹配问题.我已经定义了doubleEveryOther下面的函数,据我所知,我已经涵盖了三种可能的场景:空列表,长度列表== 1和列表长度> 1.代码编译好但是当尝试使用它抛出的函数时非穷举模式匹配错误:
*** Exception: ex2.hs:(3,1)-(5,55): Non-exhaustive patterns in function doubleEveryOther
Run Code Online (Sandbox Code Playgroud)
然后我在GHCI中启用了警告,并在加载ex2.hs文件时发现以下警告:
ex2.hs:3:1: Warning:
Pattern match(es) are non-exhaustive
In an equation for `doubleEveryOther':
Patterns not matched: _ : (_ : (_ : _))
Run Code Online (Sandbox Code Playgroud)
第3行:1指的是我认为已经覆盖的空壳 doubleEveryOther [] = []
我不知道我在哪里出错了.帮助赞赏.
干杯,
-- file: ex2.hs
doubleEveryOther :: [Integer] -> [Integer]
doubleEveryOther [] = []
doubleEveryOther (x:[]) = [x]
doubleEveryOther (_:[xs]) = take (length [xs] - 1) [xs]
Run Code Online (Sandbox Code Playgroud)
问题出在第三种模式:
doubleEveryOther (_:[xs])
Run Code Online (Sandbox Code Playgroud)
此模式匹配具有两个元素的列表的情况(因为x:[xs]相当于[x,xs]).正确的语法是:
doubleEveryOther (_:xs)
Run Code Online (Sandbox Code Playgroud)