Haskell模式匹配警告
我对Haskell(第三天学习语言)比较陌生,在模式匹配方面有问题。我在下面定义了函数Haskell模式匹配警告,haskell,Haskell,我对Haskell(第三天学习语言)比较陌生,在模式匹配方面有问题。我在下面定义了函数doubleEveryOther,就我所见,我已经介绍了三种可能的情况:空列表、长度列表==1和列表长度>1。代码可以很好地编译,但当用户尝试使用该函数时,会抛出一个非穷举模式匹配错误: *** Exception: ex2.hs:(3,1)-(5,55): Non-exhaustive patterns in function doubleEveryOther 然后,我在GHCI中启用了警告,并在加载ex2
doubleEveryOther
,就我所见,我已经介绍了三种可能的情况:空列表、长度列表==1和列表长度>1。代码可以很好地编译,但当用户尝试使用该函数时,会抛出一个非穷举模式匹配错误:
*** Exception: ex2.hs:(3,1)-(5,55): Non-exhaustive patterns in function doubleEveryOther
然后,我在GHCI中启用了警告,并在加载ex2.hs文件时发现以下警告:
ex2.hs:3:1: Warning:
Pattern match(es) are non-exhaustive
In an equation for `doubleEveryOther':
Patterns not matched: _ : (_ : (_ : _))
第3:1行是指我想我已经用doubleEveryOther[]=[]
我看不出哪里出了问题。谢谢你的帮助
干杯
-- file: ex2.hs
doubleEveryOther :: [Integer] -> [Integer]
doubleEveryOther [] = []
doubleEveryOther (x:[]) = [x]
doubleEveryOther (_:[xs]) = take (length [xs] - 1) [xs]
问题在于第三种模式:
doubleEveryOther (_:[xs])
此模式与具有两个元素的列表的情况相匹配(因为x:[xs]
相当于[x,xs]
)。正确的语法是:
doubleEveryOther (_:xs)
问题在于第三种模式:
doubleEveryOther (_:[xs])
此模式与具有两个元素的列表的情况相匹配(因为x:[xs]
相当于[x,xs]
)。正确的语法是:
doubleEveryOther (_:xs)
线路
doubleEveryOther (_:[xs]) = take (length [xs] - 1) [xs]
匹配两个元素列表,即未绑定的头,后跟包含元素xs
的单个元素列表。你应该使用
doubleEveryOther (_:xs) = take (length xs - 1) xs
您可以使用drop 1
,而不是take(n-1)
:
doubleEveryOther (_:xs) = drop xs
或使用匹配项:
(_:_:xs) = xs
在这种情况下,您可能还需要进行递归调用。行
doubleEveryOther (_:[xs]) = take (length [xs] - 1) [xs]
匹配两个元素列表,即未绑定的头,后跟包含元素xs
的单个元素列表。你应该使用
doubleEveryOther (_:xs) = take (length xs - 1) xs
您可以使用drop 1
,而不是take(n-1)
:
doubleEveryOther (_:xs) = drop xs
或使用匹配项:
(_:_:xs) = xs
在这种情况下,您可能还需要进行递归调用。明白了。我目前有空模式,1和2,但不是2或更多。将其更改为上面的值会给出空、1和2或更多的模式。谢谢你知道为什么警告是指包含第二个图案的线而不是第三个图案(第3行而不是第4行)吗?我在使用警告消息更正代码时遇到问题,这可能是一个很大的因素。@Dave0504我想这只是指模式匹配的第一行。注意,在GHC警告中,它给出了整个跨度:(3,1)-(5,55)明白了。我目前有空模式,1和2,但不是2或更多。将其更改为上面的值会给出空、1和2或更多的模式。谢谢你知道为什么警告是指包含第二个图案的线而不是第三个图案(第3行而不是第4行)吗?我在使用警告消息更正代码时遇到问题,这可能是一个很大的因素。@Dave0504我想这只是指模式匹配的第一行。注意,在GHC警告中,它给出了整个跨度:(3,1)-(5,55)