防止GHC优化共享运行时表示的值之间的转换(f.i. Int - > Integer)

时间:2014-02-16 13:15:45

标签: haskell ghc

我目前正在玩一下,有可能在Haste中从所有被提升但类似newtype的类型(带有单个参数的单个构造函数)中删除一个间接级别;例如,Int将获得一个普通的number作为其运行时表示(即42),而不是包含构造函数标记和当前完成的数字的数组(即{{1 }})。

但是,GHC似乎正在优化具有相同运行时表示的类型之间的转换,这会破坏此方案。请考虑以下事项:

[0,42]

这是GHC定义data Integer = Small Int# | Big ExternalGMPStuff data Int = I# Int# convert :: Int -> Integer convert (I# i) = Small i Integer类型的方式。现在,IntSmall将最终具有相同的构造函数标记,这意味着对于较小的值,I#Integer将具有相同的运行时表示。因此可以合理地优化Int函数,并且在某些情况下,GHC似乎正在这样做。

convert的运行时表示与Int的运行时表示相同时,此优化显然不再有效。由于能够从不需要它的所有类型中删除一个间接级别将是一个相当大的胜利,我非常想知道:

a)GHC在什么情况下执行这种优化(触发这不是非常简单,我在Int#base中找不到明确执行此操作的重写规则;和 b)有没有办法让它停止而不必完全禁用优化?

0 个答案:

没有答案