haskell - 多态函数的特化

标签 haskell polymorphism ghc typeclass

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/

相关文章:

haskell - 使用 Haskell QuickCheck 测试 TCP 端口验证器

list - 为什么使用头/尾而不是模式匹配会使评估终止?

haskell - 如何通过堆栈使用不同的 ghc 构建?

haskell - Emacs 主提示符中的函数名称自动补全 - haskell 模式

haskell - 找出 Haskell 函数的复杂性

java - Jackson 通过继承进行反序列化

haskell - 分析部分评估的程序

haskell - 内部模块的跨模块内联

list - 在 self 上指定生命周期时,Rust 在 trait 上使用动态多态性的问题

c# - 防止事件产生另一个线程