【问题标题】:Why does this OCaml expression have the following type?为什么这个 OCaml 表达式有以下类型?
【发布时间】:2014-11-10 20:34:38
【问题描述】:

表达式为f x y = 1 + (x 1) + (y 1),其类型为(int->int)->(int->int)->int。我不明白它是怎么变成那种类型的。为什么不是int->int

【问题讨论】:

    标签: types ocaml


    【解决方案1】:

    因为您有函数应用程序 (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。

    【讨论】:

      【解决方案2】:

      当 OCaml 推断表达式的类型时

      let f x y = 1 + (x 1) + (y 1)
      

      它会这样想:

      1. 由于(+) 的类型为int -> int,表达式(x 1) 的类型应为int,因为它出现在+ 的右侧。

      2. 由于x 1 的计算结果应为int,并且它是一个应用程序,因此它的类型应为_ -> int。由于1int 文字,它的类型为int -> int

      3. 使用相同的逻辑我们可以推断,y 也有类型 int -> int

      【讨论】:

        【解决方案3】:

        表达式(x 1) 要求x 是int -> 'a 类型的函数。 (y 1) 也是如此。其余的由此而来。

        【讨论】:

        • 谢谢!这是有道理的,非常感谢。
        【解决方案4】:
        let f x y = 1 + (x 1) + (y 1)
        
        1. 你有(x 1),所以x必须是一个函数

        2. 你有1 + (x 1),所以(x 1)必须返回一个int,1也是int,所以x: int -> int <fun>

        3. 使用与上述相同的归纳法,y: int -> int <fun>

        4. 你有f x y,所以f是一个函数,我们已经知道x和y是什么类型,也知道=的右边必须是一个int,所以f: (int -> int) -> (int -> int) -> int

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-28
          • 1970-01-01
          • 1970-01-01
          • 2018-04-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多