使用Hindley Milner和约束来推断递归表达式

9 haskell functional-programming type-inference ml hindley-milner

我试图推断以下表达式的类型:

let rec fix f = f (fix f)
Run Code Online (Sandbox Code Playgroud)

应该给出类型 (a -> a) -> a

使用自下而上的算法(在概括hindley-milner类型推理算法中描述)后面添加了以下规则:

           a1, c1 |-BU e1 : t1     B = fresh var
---------------------------------------------------------
a1\x, c1 U {t' == B | x : t' in A} |-BU let rec x = e1 : t
Run Code Online (Sandbox Code Playgroud)

我留下以下类型: t1 -> t2

以及以下限制:

t0 = fix
t1 = f
t2 = f (fix f)
t3 = f
t4 = fix f
t5 = fix
t6 = f

t3 = t1
t3 = t4 -> t2
t5 = t0
t5 = t6 -> t4
t6 = t1
Run Code Online (Sandbox Code Playgroud)

我无法看到如何解决这些约束,以便我留下类型(a -> a) -> a.我希望有人看到我出错了很明显.

这里有完整的源代码

Sjo*_*her 9

t7第一个不应该有fix f吗?这些给出了约束:

t7 = t2
t0 = t1 -> t7
Run Code Online (Sandbox Code Playgroud)

从那以后你应该能够推断出那个t4 = t2然后t0 = (t2 -> t2) -> t2.