Haskell 使用Hindley-Milner&;约束条件

Haskell 使用Hindley-Milner&;约束条件,haskell,functional-programming,type-inference,ml,hindley-milner,Haskell,Functional Programming,Type Inference,Ml,Hindley Milner,我试图推断以下表达式的类型: let rec fix f = f (fix f) 应该为其指定类型(a->a)->a 使用自底向上算法(在推广hindley-milner类型推理算法中描述)和以下添加的规则后: a1, c1 |-BU e1 : t1 B = fresh var --------------------------------------------------------- a1\x, c1 U {t' == B | x : t' in A} |

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

let rec fix f = f (fix f)
应该为其指定类型
(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
我只剩下以下类型:
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
t7 = t2
t0 = t1 -> t7
我看不出这些约束是如何解决的,因此我只能使用
(a->a)->a
类型。我希望有人能清楚地看到我是不是做错了


第一个
修复f
是否应该有
t7
?这些限制条件包括:

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
t7 = t2
t0 = t1 -> t7

从这一点上,你应该能够推断出
t4=t2
然后
t0=(t2->t2)->t2

你是正确的,我没有在上面的规则中限制B到t!请注意,
let rec
应该是简单的
let
,否则您只是定义了一个函数
rec:((a->b)->a->(a->b)->b
@Ptharien的抱歉代码示例不是用haskell编写的,而是用ML风格的语言编写的。好的,只是您的问题被标记为“haskell”所以我认为这就是你使用的语言。很抱歉