我目前正在玩一下,有可能在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
类型的方式。现在,Int
和Small
将最终具有相同的构造函数标记,这意味着对于较小的值,I#
和Integer
将具有相同的运行时表示。因此可以合理地优化Int
函数,并且在某些情况下,GHC似乎正在这样做。
当convert
的运行时表示与Int
的运行时表示相同时,此优化显然不再有效。由于能够从不需要它的所有类型中删除一个间接级别将是一个相当大的胜利,我非常想知道:
a)GHC在什么情况下执行这种优化(触发这不是非常简单,我在Int#
或base
中找不到明确执行此操作的重写规则;和
b)有没有办法让它停止而不必完全禁用优化?