我正在尝试编写一个简单的 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

  • 1
    在这儿干什么Show a =>


    – 

  • 1
    但错误仍然相同吗?我认为错误来自其他地方(可能是上面几行)。


    – 

  • 1
    我尝试将您的代码复制并粘贴到在线 IDE(godbolt.org)上,它运行良好,没有警告。我只能想到两种可能性:1) 您在 GHCi 中手动输入代码,而不是从文件中加载代码(尽管错误消息中看起来并非如此——看起来您正在正确使用 GHC);2) 您正在编译与您发布的文件不同的文件。


    – 


  • 3
    我认为您需要包含更多文件。复制文件,删除所有可以删除的内容而不更改错误,然后向我们展示。就目前情况而言,您提供的代码不会导致您在 9.8.2 中描述的错误(至少在这里不会)。(而且,如果 GHC 的行为方式与您在这个问题中描述的方式相同,我会认为这是一个错误。)


    – 


  • 2
    @talex 我不知道为什么 tio.run 没有这样做,但是当我将其添加{-# OPTIONS -Werror=incomplete-patterns #-}到你的 onecompiler.com 时,它就重现了。


    – 


最佳答案
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 的一个错误。扩展OverloadedListsRebindableSyntax不再协同工作。请参阅

1

  • 1
    创建了一个问题:


    –