当未为AFAIK定义时,此OCaml表达式具有其参数类型,为什么另一个表达式具有'_a而不是'a?

时间:2018-11-20 17:45:05

标签: ocaml type-inference

我明白了

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 bfapply 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

如果有人可以帮助我理解为什么会这样,以便我不会因为不理解而简单地提交答案而感到迷茫,那将不胜感激。

1 个答案:

答案 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