我正在尝试使用基于 Hindley-Milner 算法的类型推断来实现语言。但我不知道如何推断递归函数的类型:
f = g
g = f
f
在这里,我必须为和一起生成和解决约束,g
因为如果我早些时候为一个函数执行此操作,它将不知道另一个函数的类型。但我不能同时对模块中的所有功能执行此操作:
f = h 0
g = h "str"
h _ = 0
在f
I haveh :: Int -> Int
和 in g
I haveh :: String -> Int
中,如果我同时解决它会产生错误,但如果我将推断h
之前类型的类型f
和g
(h :: forall a. a -> Int
并且可以用于f
和g
不同的替换a
),则不会产生错误。
我如何推断这些类型?