Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell模式匹配警告_Haskell - Fatal编程技术网

Haskell模式匹配警告

Haskell模式匹配警告,haskell,Haskell,我对Haskell(第三天学习语言)比较陌生,在模式匹配方面有问题。我在下面定义了函数doubleEveryOther,就我所见,我已经介绍了三种可能的情况:空列表、长度列表==1和列表长度>1。代码可以很好地编译,但当用户尝试使用该函数时,会抛出一个非穷举模式匹配错误: *** Exception: ex2.hs:(3,1)-(5,55): Non-exhaustive patterns in function doubleEveryOther 然后,我在GHCI中启用了警告,并在加载ex2

我对Haskell(第三天学习语言)比较陌生,在模式匹配方面有问题。我在下面定义了函数
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)