在他的演讲“Classes,Jim,但不是我们所知道的”中,Simon Peyton-Jones讨论了如何通过多态函数采用额外的参数来实现GHC中的类型类,该参数是具有该类型的正确函数的字典(s)给予该职能。
然后他说GHC经常通过特殊套接字函数来优化函数,而不是在运行时实际传递这个字典。然后他说这并不总是可行的,因为 Haskell有多态递归,所以即使你有整个程序,你也不一定能消除所有的多态性。
他的意思是什么?什么是程序的例子,在编译时无法知道多态函数将被传递的类型?
答案 0 :(得分:3)
这是多态递归的典型示例。假设我们有一个类似于列表的数据类型,但每个元素的类型都是前一个类型的两倍:
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'
的递归调用与原始调用的类型不同。
由于无法静态地知道可能会创建哪些列表,因此我们无法从程序中删除所有词典。