表达式为f x y = 1 + (x 1) + (y 1)
,其类型为(int->int)->(int->int)->int
。我不明白它是怎么样的。为什么不是int->int
?
答案 0 :(得分:3)
因为你有函数应用程序(x 1)和(y 1)。 x和y被视为采用int参数并返回int的函数。
所以x是type(int - > int),y是type(int - > int)。 在x和y上都应用了1。因此,如果将1应用于类型为(int - > int)的内容,则会得到类型为int的内容。所以你的整个函数返回1 + int + int,这基本上是int。
答案 1 :(得分:3)
当OCaml推断表达的类型
时let f x y = 1 + (x 1) + (y 1)
它会想到这样的事情:
由于(+)
的类型为int -> int
,因此表达式(x 1)
的类型应为int
,因为它出现在+
的右侧。
由于x 1
应评估为int
并且它是一个应用程序,因此它应该具有类型_ -> int
。由于1
是int
字面值,因此其类型为int -> int
。
使用我们可以推断的相同逻辑,y
也有类型int -> int
。
答案 2 :(得分:2)
表达式(x 1)
要求x是类型int -> 'a
的函数。同样适用于(y 1)
。其余部分来自于此。
答案 3 :(得分:2)
let f x y = 1 + (x 1) + (y 1)
您有(x 1)
,因此x必须是函数
你有1 + (x 1)
,所以(x 1)
必须返回一个int,同时1是int,所以x: int -> int <fun>
使用与上述相同的归纳,y: int -> int <fun>
你有f x y
,所以f是一个函数,我们已经知道x和y是什么类型,并且知道=
的右侧必须是int,所以{{1 }}