多态函数的专门化
在他的演讲“类,吉姆,但不是我们所知道的”中,Simon Peyton-Jones讨论了如何在GHC中实现类型类,方法是使多态函数采用额外参数,该参数是具有正确函数类型的字典,赋予该功能。
然后他说,GHC经常通过特殊外壳函数优化函数,而不是在运行时实际传递该字典。 然后他说这并不总是可能的,因为Haskell具有多态递归,所以即使你有整个程序,也不一定消除所有的多态性。
他这是什么意思? 什么是一个程序的例子,其中一个人不知道多态函数的类型将在编译时传递?
这是一个多态递归的典型例子。 假设我们有一个类似于列表的数据类型,但是每个元素的类型是前一个元素的两倍“大”:
data Poly a = Nil | Cons a (Poly (a,a)) deriving Show
foo :: Poly Int
foo = Cons 3 (Cons (4,5) (Cons ((6,7),(8,9)) Nil))
length' :: Poly a -> Int
length' Nil = 0
length' (Cons _ xs) = 1 + length' xs
请注意,递归调用length'
与原始调用有不同的类型。
由于不可能静态地知道哪些列表可能会被创建,所以我们不能删除程序中的所有字典。
链接地址: http://www.djcxy.com/p/43211.html