Pet*_*lák 17 recursion haskell type-inference ghc hindley-milner
请考虑以下示例:
f x = x
g y = f 'A'
Run Code Online (Sandbox Code Playgroud)
GHC推断 f :: a -> a
f x = const x g
g y = f 'A'
Run Code Online (Sandbox Code Playgroud)
现在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
Run Code Online (Sandbox Code Playgroud)
size除非给出明确的类型,否则GHC无法推断出类型.
因此,看起来Haskell(GHC)不使用多态递归(如Alan Mycroft中描述的:多态类型方案和递归定义),因为它不能推断示例2和3中的多态类型.但在第一种情况下它正确推断最常见的类型f.什么是确切的程序?是否GHC分析表达式,组织它们的依赖一起(类似f与g在第二个例子),并在这些团体使用单态递归类型推断?