Haskell:非穷举模式-检查列表是否为升序

Haskell:非穷举模式-检查列表是否为升序,haskell,non-exhaustive-patterns,Haskell,Non Exhaustive Patterns,我不知道为什么我的函数不起作用。我已经阅读了所有关于非穷举函数的帖子,但是我的函数满足了我所能看到的所有可能的选项 ascending :: [Int] -> Bool ascending [] = error "Empty list given" ascending [x] = True ascending [x,y] | y>=x = True | x<y = F

我不知道为什么我的函数不起作用。我已经阅读了所有关于非穷举函数的帖子,但是我的函数满足了我所能看到的所有可能的选项

ascending :: [Int] -> Bool
ascending []                = error "Empty list given"
ascending [x]               = True
ascending [x,y]     | y>=x  = True
                    | x<y   = False
ascending (x:y:xs)  | y>=x  = (ascending (y:xs))
                    | x<y   = False

它适用于一对,但如果该对不上升,则不起作用。当我遵循我的代码时,它应该返回False。

仔细查看您的
[x,y]
模式的防护:

升序[x,y]| y>=x=True
|x=1);然后,第二个保护被检查,但它的计算结果也是
False
(因为1<2)。因此,使用了下一个模式(因为
[2,1]
也匹配了
(x:y:ys)
),但发生了完全相同的事情。因为这是最后一种模式,GHC有理由对你尖叫

你的守卫中的不平等不是互补的。你的第三个模式应该是

升序[x,y]| x y=False
或者,为了减少出错的空间

升序[x,y]| x布尔
升序(x:y:xs)=x布尔

升序xs=和$zipWith(仔细查看您的
[x,y]
模式的防护:

升序[x,y]| y>=x=True
|x=1);然后,第二个保护被检查,但它的计算结果也是
False
(因为1<2)。因此,使用了下一个模式(因为
[2,1]
也匹配了
(x:y:ys)
),但发生了完全相同的事情。因为这是最后一种模式,GHC有理由对你尖叫

你的守卫中的不平等不是互补的。你的第三个模式应该是

升序[x,y]| x y=False
或者,为了减少出错的空间

升序[x,y]| x布尔
升序(x:y:xs)=x布尔

升序xs=和$zipWith(仔细查看比较。当使用
[2,1]
调用它时,它应该下降到哪个分支?@David我原以为它会上升[x,y]用x=2和y=1…然后点击…我觉得自己像个白痴。现在我知道“非穷举”也包括防护装置。谢谢!如果启用警告,GHC应该对此进行静态警告。非常粗略地说,如果最后一个防护装置不是
,否则
True
,则案例分支被认为不是穷举的,除非下面有另一个分支捕获可能不匹配的术语,它将触发警告。在我看来,这是一个编译时错误(如Agda等)因此,为了迫使程序员编写所有案例,即使其中一些案例只是
未定义的
。请仔细查看比较。当它被
[2,1]
调用时,应该向下哪个分支?@David我原以为它会向上向下[x,y]用x=2和y=1…然后点击…我觉得自己像个白痴。现在我知道“非穷举”也包括防护装置。谢谢!如果启用警告,GHC应该对此进行静态警告。非常粗略地说,如果最后一个防护装置不是
,否则
True
,则案例分支被认为不是穷举的,除非下面有另一个分支捕获可能不匹配的术语,它将触发警告。在我看来,这是一个编译时错误(如Agda等)因此,为了迫使程序员编写所有案例,即使其中一些案例只是
未定义的
。这是一个非常全面的答案。谢谢。@deadfire19,最后,一个空列表正在升序,因此不必将该案例设为错误。
升序[]=True
就可以了。或者你可以把最后一个案例移到开头,然后再做第二个案例
升序=True
。这是一个非常全面的答案。谢谢。@deadfire19,最后,一个空列表正在升序,所以不需要将该案例作为错误。
升序[]=True
就可以了。或者您可以将最后一个大小写移到开头,然后将第二个大小写升序。
*Main> ascending []
*** Exception: Empty list given
*Main> ascending [1]
True
*Main> ascending [1, 2]
True
*Main> ascending [2, 1]
*** Exception: test01.hs:(51,1)-(56,55): Non-exhaustive patterns in function ascending