我明白了
let apply f x = f x
有类型
('a -> 'b) -> 'a -> 'b
apply
是一个接受函数f
和参数x
并返回应用于f
的{{1}}的函数。因此,如果x
的类型为f x
,而'b
的类型为x
,则'a
的类型必须为f
,因此您可以将它们组合为得到'a -> 'b
。我明白了。通过扩展,('a -> 'b) -> 'a -> 'b
的类型为let identity f = f
,因为它接受类型为'a -> 'a
的项并返回相同的类型为'a'
的项,因此它的类型为'a
。我明白了。
'a -> 'a
是类型
let bf b f = if (f b) then f else (fun x -> b)
bool -> (bool -> bool) -> bool -> bool
的类型必须为f b
,因此bool
的类型为f
,而'a -> bool
的类型为b
。类型为'a
的{{1}}与类型为f
的{{1}}具有相同的类型。因此,'a -> bool
,因此fun x -> b
取'c -> 'a
,然后取'c = 'a = bool
的类型为bf
,并返回bool
,以得出最终类型的
f
我必须找到
的类型bool -> bool
与bool -> bool
相同的类型。
因此,如果bool -> (bool -> bool) -> bool -> bool
具有类型let t1 = apply bf
,则apply bf
为apply f
,所以我希望'a -> 'a
具有f
'a
显然apply bf
的类型为type(bf) -> type(bf)
,我不知道为什么会这样。
我也没有得到bool -> (bool -> bool) -> bool -> bool -> bool -> (bool -> bool) -> bool -> bool
类型和apply bf
类型之间的区别。
如果为bool -> (bool -> bool) -> bool -> bool
,则'a
的类型为'_a
,而let apply f x = f x
的类型为
apply
如果有人可以帮助我理解为什么会这样,以便我不会因为不理解而简单地提交答案而感到迷茫,那将不胜感激。
答案 0 :(得分:1)
我希望将bf应用于type(bf)-> type(bf)
这是错误的。首先请注意,应用程序的键入规则是
f : A -> B
x : A
-------------
f x : B
在您的情况下,存在多态性,但想法是相同的,
apply : ('a -> 'b) -> ('a -> 'b)
bf : A -> B
------------------------------------
apply : (A -> B) -> (A -> B)
bf : A -> B
------------------------------------
apply bf : A -> B
我也无法理解'a类型和'_a类型之间的区别。
符号'_a
表示伪类型,“值限制”的结果表明仅值表达式可以是多态的。参见http://mlton.org/ValueRestriction