【发布时间】:2014-11-10 20:34:38
【问题描述】:
表达式为f x y = 1 + (x 1) + (y 1),其类型为(int->int)->(int->int)->int。我不明白它是怎么变成那种类型的。为什么不是int->int?
【问题讨论】:
表达式为f x y = 1 + (x 1) + (y 1),其类型为(int->int)->(int->int)->int。我不明白它是怎么变成那种类型的。为什么不是int->int?
【问题讨论】:
因为您有函数应用程序 (x 1) 和 (y 1)。 x 和 y 被视为接受 int 参数并返回 int 的函数。
所以 x 是类型 (int -> int) 而 y 是类型 (int -> int)。 1 适用于 x 和 y。因此,如果将 1 应用于类型为 (int -> int) 的东西,您将得到类型为 int 的东西。所以你的整个函数返回 1 + int + int 这基本上是 int。
【讨论】:
当 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。
【讨论】:
表达式(x 1) 要求x 是int -> 'a 类型的函数。 (y 1) 也是如此。其余的由此而来。
【讨论】:
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,所以f: (int -> int) -> (int -> int) -> int
【讨论】: