Haskell 多态函数的特化

Haskell 多态函数的特化,haskell,polymorphism,ghc,typeclass,Haskell,Polymorphism,Ghc,Typeclass,西蒙·佩顿·琼斯(Simon Peyton Jones)在他的演讲《类,Jim,但不是我们所知道的那样》中谈到了类型类是如何在GHC中实现的,方法是让多态函数获取一个额外的参数,该参数是一个字典,其中包含给定给函数的类型的正确函数 他接着说,GHC通常通过特殊的大小写函数来优化函数,而不是在运行时实际传递这个字典。他接着说,这并不总是可能的,因为Haskell有多态递归,所以即使你有整个程序,也不一定能消除所有多态性 他这是什么意思?在编译时无法知道多态函数将传递的类型的程序示例是什么?这里是多

西蒙·佩顿·琼斯(Simon Peyton Jones)在他的演讲《类,Jim,但不是我们所知道的那样》中谈到了类型类是如何在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'
的递归调用与原始调用的类型不同


由于无法静态地知道可能会创建哪些这样的列表,因此我们无法从程序中删除所有字典。

因此,在这种情况下,当谈到多态递归时,数据类型是递归的?@beta:No,多态递归发生在您对不同于您开始使用的类型递归调用函数时<代码>f::显示a=>Int->a->String;f 0 x=显示x;fnx=f(n-1)[x]是一个发生在普通列表上的多态递归。。。实际上在示例中添加了一个多态递归函数。这确实说明了为什么这些示例在运行时需要字典。谢谢(实际上,我根本不知道类型系统允许这样的函数。)只有在您提供类型签名时才允许它们。多态递归的推理是不可判定的。