我正在尝试编写一个简单的 Haskell 函数来区分空列表和非空列表。这是我的代码:
{-# LANGUAGE OverloadedLists, RebindableSyntax #-}
import Prelude (Int, IO, putStrLn)
import GHC.Exts (IsList (..))
doneVsItems :: [Int] -> IO ()
doneVsItems [] = putStrLn "Done"
doneVsItems (p:ps) = putStrLn "Items"
main :: IO ()
main = doneVsItems []
但是,当我启用 -Werror=incomplete-patterns 编译代码时,出现以下错误:
error: [GHC-62161] [-Wincomplete-patterns, Werror=incomplete-patterns]
Pattern match(es) are non-exhaustive
In an equation for ‘doneVsItems’:
Patterns of type ‘[Int]’ not matched: []
|
7 | doneVsItems [] = putStrLn "Done"
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
我明确地对空列表 ([]) 和非空列表 ((p:ps)) 进行了模式匹配,所以我不明白为什么 GHC 说模式匹配是非穷尽的。我在这里遗漏了什么?
看起来 OverloadedLists 和 RebindableSyntax 不再协同工作。我创建了一个问题。
11
最佳答案
2
这确实是一个非常奇怪的情况,尤其是它抱怨缺少模式[]
并指向模式[]
。但我有一个猜测:这个定义是在where
子句内部进行的,但只是部分定义。例如,以下代码:
foo = () where
doneVsItems [] = ()
doneVsItems (p:ps) = ()
产生以下警告:
test.hs:2:2: warning: [GHC-62161] [-Wincomplete-patterns]
Pattern match(es) are non-exhaustive
In an equation for ‘doneVsItems’:
Patterns of type ‘[a]’ not matched: (_:_)
|
2 | doneVsItems [] = ()
| ^^^^^^^^^^^^^^^^^^^
test.hs:3:1: warning: [GHC-62161] [-Wincomplete-patterns]
Pattern match(es) are non-exhaustive
In an equation for ‘doneVsItems’:
Patterns of type ‘[a]’ not matched: []
|
3 | doneVsItems (p:ps) = ()
| ^^^^^^^^^^^^^^^^^^^^^^^
也许您不小心复制并粘贴了一个警告的一部分和另一个警告的一部分???
如果您的编辑器的制表位没有设置为 8 个空格,则两个子句的缩进可能看起来相同但却被视为不同,因此如果肉眼看起来没问题,则需要检查的一件事是两行中的制表符是否匹配。
0
|
这是 GHC 的一个错误。扩展OverloadedLists
和RebindableSyntax
不再协同工作。请参阅。
1
-
1创建了一个问题:
–
|
Show a =>
?–
–
–
–
{-# OPTIONS -Werror=incomplete-patterns #-}
到你的 onecompiler.com 时,它就重现了。–
|