在Haskell(GHC)中使用什么算法来导出递归表达式的类型?

时间:2014-06-08 11:47:57

标签: haskell recursion ghc type-inference hindley-milner

请考虑以下示例:

非递归函数

 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是否分析表达式的依赖关系,将它们组合在一起(如第二个例子中的fg)并对这些组使用单态递归类型推断?

1 个答案:

答案 0 :(得分:14)

  

GHC是否分析表达式的依赖关系,将它们组合在一起(如第二个例子中的f和g),并对这些组使用单态递归类型推断?

是的,确实发生了这种情况。 Haskell 2010报告的主题为section