gpt4 book ai didi

haskell - 重写规则不会触发匹配多个实例方法的规则

转载 作者:行者123 更新时间:2023-12-03 15:06:07 26 4
gpt4 key购买 nike

据我所知,我认为 id1 和 id2 来自类型类而 id1' 和 id2' 不会有任何区别。我正在使用最新的 Haskell 平台(同时使用 GHC 版本 7.0.4 和现在的 7.4.1)运行“ghc Rewrite”,并且我希望 to1 也会触发。

$ ghc Rewrite
[1 of 1] Compiling RewriteProblems ( Rewrite.hs, Rewrite.o )
Rule fired: rewrite/ez'
Rule fired: rewrite/to1'
Rule fired: rewrite/ez
Rule fired: rewrite/ez
Rule fired: Class op id2
Rule fired: Class op id2

这个例子:
{-# OPTIONS_GHC -O -ddump-rule-firings #-}
module RewriteProblems where

{-# RULES
"rewrite/ez" forall a. id1 a = RDUnit
"rewrite/to1" forall a. id2 (id2 a) = id1 a
"rewrite/ez'" forall a. id1' a = RDUnit
"rewrite/to1'" forall a. id2' (id2' a) = id1 a
#-}

class Ider a where
id1 :: a -> a
id2 :: a -> a

data RewriteD = RDUnit

instance Ider RewriteD where
{-# INLINE[1] id1 #-}
{-# INLINE[1] id2 #-}
id1 a = RDUnit
id2 a = RDUnit

testThing1 :: RewriteD
testThing1 = id1 RDUnit

testThing2 :: RewriteD
testThing2 = id2 (id2 RDUnit)

testThing1' :: RewriteD
testThing1' = id1' RDUnit

testThing2' :: RewriteD
testThing2' = id2' (id2' RDUnit)

{-# INLINE[1] id1' #-}
{-# INLINE[1] id2' #-}
id1' :: RewriteD -> RewriteD
id2' :: RewriteD -> RewriteD
id1' a = RDUnit
id2' a = RDUnit

最佳答案

(在整个帖子中进行了几处编辑,并提供了更新的信息)

在您的输出中,请注意 Rule fired: Class op id2 行.这些是 GHC 为类型类实例自动创建的规则。此规则首先触发,因此您自己的规则永远不会有机会匹配。如果您使用“-ddump-simpl-iterations”进行编译,您可以检查 Class op 规则是否在第一阶段触发,之后您的“to1”规则将永远不会匹配。

这是一个解决方法。先注释掉testThing1 , testThing1' , 和 testThing2'所以只有 testThing2被编译。这是“rewrite/to1”可以触发的唯一函数,因此它隔离了您正在查看的测试用例。接下来添加另一个形式的规则:

"rewrite/to_id2'"   forall a. id2 a = id2' a

你会看到这个输出:
$ ghc -c foo.hs
Rule fired: rewrite/to_id2'
Rule fired: rewrite/to_id2'
Rule fired: rewrite/to1'
Rule fired: rewrite/ez

新规则现在触发而不是类 op,它允许 rewrite/to1'来简化表达式。有趣的是,新规则出现在 rewrite/to1 的上方或下方都没有关系。在规则列表中。

我不知道为什么你的 id2 (id2 a)规则不匹配而 id2 a做。看起来它应该匹配(根据 -dverbose-core2core),但事实并非如此。我仍然怀疑某种类型的 GHC 优先级错误,尽管我也看到 ghc-7.4.1 的相同行为,所以它不是 4397 .

关于haskell - 重写规则不会触发匹配多个实例方法的规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9811294/

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