GHC在可能的情况下是否消除多态性间接性?

showInt :: Int -> String
showInt x = show x

上面的代码调用是否show传递Int字典或直接调用在Show Int实例上声明的函数?

我的意思是,GHC在可能的情况下是否从生成的代码中移除多态性间接?


是。 这是使用GHC 7.4.2生成的核心:

Foo.showInt :: GHC.Types.Int -> GHC.Base.String
[... attributes omitted ...]
Foo.showInt = GHC.Show.$fShowInt_$cshow

正如你所看到的,它只是一个直接引用GHC.Show.$fShowInt_$cshow

比较一下如果我们移除类型签名会发生什么,以便使用推断类型Show a => a -> String来代替:

Foo.showInt
  :: forall a_aop. GHC.Show.Show a_aop => a_aop -> GHC.Base.String
[... attributes omitted ...]
Foo.showInt =
   (@ a_aot) ($dShow_aou :: GHC.Show.Show a_aot) (x_a9Z :: a_aot) ->
    GHC.Show.show @ a_aot $dShow_aou x_a9Z

在这里,它需要一个字典参数$dShow_aou ,它使用访问器函数GHC.Show.show在将结果函数应用于参数x_a9Z之前从该字典中查找适当的函数。

在第一种情况下,至少在概念上会发生什么,因为具体类型是已知的,GHC插入对适当实例字典的直接引用,而不是将其作为参数。 然后,访问者(基本上只是一个唱片公司)可以内联,并且您可以直接引用相应的功能。


GHC不这样做。 想想一个新的创建类型的可读性:

type Vector = (Float, Float)

如果GHC从以下功能中删除多态:

(!+!) :: Vector -> Vector -> Vector
(x1, y1) !+! (x2, y2) = (x1 + x2, y1 + y2)

该类型将变为:

(!+!) :: (Float, Float) -> (Float, Float) -> (Float, Float)

虽然这个功能是专门针对Vector的。

链接地址: http://www.djcxy.com/p/11507.html

上一篇: Does GHC removes polymorphic indirection when possible?

下一篇: Xcode: how to build a static library project correctly?