请考虑以下示例:
f x = x
g y = f 'A'
GHC推断f :: a -> a
f x = const x g
g y = f 'A'
现在GHC推断f :: Char -> Char
,即使在前一种情况下类型可能是a -> a
。
data FullTree a = Leaf | Bin a (FullTree (a, a))
size :: FullTree a -> Int
size Leaf = 0
size (Bin _ t) = 1 + 2 * size t
此处GHC无法推断size
的类型,除非给出其显式类型。
所以看起来Haskell(GHC)并没有使用多态递归(如Alan Mycroft: Polymorphic type schemes and recursive definitions中所述),因为它不能推断示例2和3中的多态类型。但是在第一个它正确地推断出最常见的f
类型。什么是确切的程序? GHC是否分析表达式的依赖关系,将它们组合在一起(如第二个例子中的f
和g
)并对这些组使用单态递归类型推断?
答案 0 :(得分:14)
GHC是否分析表达式的依赖关系,将它们组合在一起(如第二个例子中的f和g),并对这些组使用单态递归类型推断?
是的,确实发生了这种情况。 Haskell 2010报告的主题为section。