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



我刚刚写了一个函数,以在tic-tac-toe中进行移动。我想推动图案匹配。所以我写了9个makeAMove条款。每个都有一个带有空符号指定不同空间的TIC-TAC-TOE板。看起来像这样。

makeAMove [[E,   m12, m13],
           [m21, m22, m23],
           [m31, m32, m33]] X 1 1 = ...

本条款将在板的左上角放置一个X。x,o和e定义为标记。

data Mark = X |  O | E deriving (Eq, Show)

加载文件时,我会收到此警告消息。

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)

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

当我将条款数量限制为5时,将其余的子句限制在与默认情况下链接的另一个函数中时,没有问题。

这是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 = ()

结果:

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)

我想检查器试图过于急切地生成反例:有很多无与伦比的模式,随着参数的数量而成倍增长。

的确,在第一次匹配之后,无与伦比的情况为

A _ _ _ _ _ _ _ _
B _ _ _ _ _ _ _ _
...
E _ _ _ _ _ _ _ _

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

A A _ _ _ _ _ _ _
A ...
A E _ _ _ _ _ _ _
B A _ _ _ _ _ _ _
B ...
B E _ _ _ _ _ _ _
...
E A _ _ _ _ _ _ _
E ...
E E _ _ _ _ _ _ _

等等。这会成倍增长。

相关内容

  • 没有找到相关文章

最新更新