GHC在编译模式时会做什么样的迭代?

Rus*_*ott 8 haskell pattern-matching ghc

我刚刚写了一个在Tic-Tac-Toe中移动的功能.我想推动模式匹配.所以我写了9个makeAMove条款.每个都有一个Tic-Tac-Toe板,其空间由空符号指定.它看起来像这样.

makeAMove [[E,   m12, m13],
           [m21, m22, m23],
           [m31, m32, m33]] X 1 1 = ...
Run Code Online (Sandbox Code Playgroud)

该子句将X放在板的左上角.X,O和E定义为标记.

data Mark = X |  O | E deriving (Eq, Show)
Run Code Online (Sandbox Code Playgroud)

当我加载文件时,我收到此警告消息.

warning:
    Pattern match checker exceeded (2000000) iterations in
    an equation for ‘mov1’. (Use -fmax-pmcheck-iterations=n
    to set the maximun number of iterations to n)
Run Code Online (Sandbox Code Playgroud)

我的问题是好奇心.模式匹配器在做什么样的迭代?为什么需要这么多?

当我将条款数量限制为5,并将其余条款放在另一个由默认情况链接的函数中时,没有问题.

chi*_*chi 9

这是一个MCVE:

{-# OPTIONS -Wall #-}
data T = O | A | B | C | D | E

f :: T -> T -> T -> T -> T -> T -> T -> T -> T -> ()
f O _ _ _ _ _ _ _ _ = ()
f _ O _ _ _ _ _ _ _ = ()
f _ _ O _ _ _ _ _ _ = ()
f _ _ _ O _ _ _ _ _ = ()
f _ _ _ _ O _ _ _ _ = ()
f _ _ _ _ _ O _ _ _ = ()
f _ _ _ _ _ _ O _ _ = ()
f _ _ _ _ _ _ _ O _ = ()
f _ _ _ _ _ _ _ _ O = ()
Run Code Online (Sandbox Code Playgroud)

结果:

ExhaustivePattern3.hs:5:5: warning:
    Pattern match checker exceeded (2000000) iterations in
    an equation for ‘f’. (Use -fmax-pmcheck-iterations=n
    to set the maximun number of iterations to n)
Run Code Online (Sandbox Code Playgroud)

我猜测试者正试图过于急切地产生反例:有许多不匹配的模式,随着参数的数量呈指数增长.

事实上,在第一场比赛之后,无与伦比的情况就是如此

A _ _ _ _ _ _ _ _
B _ _ _ _ _ _ _ _
...
E _ _ _ _ _ _ _ _
Run Code Online (Sandbox Code Playgroud)

然后在第二个之后,这扩展到:

A A _ _ _ _ _ _ _
A ...
A E _ _ _ _ _ _ _
B A _ _ _ _ _ _ _
B ...
B E _ _ _ _ _ _ _
...
E A _ _ _ _ _ _ _
E ...
E E _ _ _ _ _ _ _
Run Code Online (Sandbox Code Playgroud)

等等.这呈指数增长.

  • @Alec看起来[this](https://ghc.haskell.org/trac/ghc/ticket/11822)是最相关的票. (2认同)