Simon Peyton-Jones 在他的演讲“类,Jim,但不是我们所知道的那样”中讨论了类型类是如何在 GHC 中实现的,方法是让多态函数采用一个额外的参数,该参数是一个具有该类型的正确函数的字典(s) 赋予该函数。
然后他说 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'
的递归调用与原始调用的类型不同。
由于不可能静态地知道可能会创建哪些此类列表,因此我们无法从程序中消除所有字典。
关于haskell - 多态函数的特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18341146/