gpt4 book ai didi

haskell - GHC 在编译模式时做了哪些迭代?

转载 作者:行者123 更新时间:2023-12-04 06:55:29 25 4
gpt4 key购买 nike

我刚刚编写了一个用于在井字游戏中移动的函数。我想插入模式匹配。所以我写了 9 makeAMove条款。每个人都有一个井字游戏板,不同的空间由空符号指定。它看起来像这样。

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 _ _ _ _ _ _ _

等等。这呈指数增长。

关于haskell - GHC 在编译模式时做了哪些迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40879983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com