【发布时间】:2015-02-08 00:05:02
【问题描述】:
我不知道为什么我的功能不起作用。我浏览了所有关于非详尽函数的帖子,但据我所知,我的函数满足了所有可能的选项。
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
结果:
*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
它适用于一对,但如果这对不上升,则无效。当我遵循我的代码时,它应该只是返回 False。
【问题讨论】:
-
仔细查看比较。当使用
[2, 1]调用它时,应该关闭哪个分支? -
@David 我原以为它会在 x = 2 和 y = 1 的情况下上升 [x, y] ......然后它点击了......我觉得自己像个白痴.好吧,现在我知道“非详尽”还包括警卫。谢谢!
-
如果您启用警告,GHC 应该静态地发出警告。非常粗略地说,如果最后一个守卫不是
otherwise或True,则认为case 分支不是详尽无遗的,除非下面有另一个分支捕获可能不匹配的术语,否则它将触发警告。 IMO,我希望这是一个编译时错误(如 Agda 等),以便强制程序员编写所有案例,即使其中一些只是undefined。
标签: haskell non-exhaustive-patterns