【问题标题】:Ocaml Type-inference of fun f [x; y; z] -> (f x y), (f z);;fun f [x; 的 Ocaml 类型推断是; z] -> (f x y), (f z);;
【发布时间】:2014-06-11 07:58:39
【问题描述】:

我有这个 OCaml 函数:

fun f [x; y; z] -> (f x y), (f z);;

老师要我回答:这个函数的类型是什么。 但我不明白[x; y; z] 是什么意思?它是一个列表吗?我不这么认为,因为解决方案是

('a -> 'a-> 'b) -> 'a list -> b*('a->'b))

这意味着z 是不同的类型,我无法理解如何获得它。是向量吗?三个输入的序列?也不要这么认为,否则会是

fun f x y z -> (f x y), (f z);;

有人可以帮我吗?

【问题讨论】:

  • 这是一个列表,因此 x、y 和 z 必须具有相同的类型。

标签: ocaml type-inference


【解决方案1】:

好的,让我们评估fun f [x; y; z] -> (f x y), (f z) this 的类型。

  • 我们的函数接受参数并返回一个元组。所以它的类型将是_ -> _ -> _ * _,其中下划线尚未评估部分。我们将在下面评估它们
  • 我们的第二个参数是一个列表,所以xyz的类型是相同的。 _ -> 'a list -> _ * _
  • 当我们查看结果元组 (f x y) 中的第一个表达式时,我们看到 f 应用于 xy,因此我们可以将结果重写为: ('a -> 'a -> 'b) -> 'a list -> 'b * _
  • 在函数结果表达式的第二个表达式中,我们看到f z。但我们已经知道f 已经是'a -> 'a -> 'b,所以f z 似乎有'a -> 'b 类型。 ('a -> 'a -> 'b) -> 'a list -> 'b * ('a -> 'b)
  • 等等!

【讨论】:

  • 谢谢。我还有 2 个问题: 1:在第 3 步中,您的意思是“我们看到 f 应用于 x 和 y”而不是“我们看到 f 应用于 x 和 z”? 2:f z 的类型为 'a->'b,因为它仍然错过了一个参数,而且我知道它因为 f x y 而弄乱了一个参数(我看到 f 需要 2 个参数:x 和 y)?
  • 第二:我认为你说得对。很难正确地表述它,因为这些函数是柯里化的形式,从技术上讲,那里的所有函数只有一个参数。
【解决方案2】:

这确实是一个列表。它不可能是别的东西。

您的函数接受两个参数。第一个是一个函数,第二个是一个列表,它被解构为三个值。该函数接受两个参数。由于 OCaml 中的所有函数都是 currified,因此它也可以接受一个参数并“返回”一个函数,该函数将接受另一个参数并产生结果。

因此,最后您会得到一对将函数 f 应用于列表的前两个元素的结果,以及将同一函数部分应用于列表的第三个元素的结果。

希望这能回答你的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    相关资源
    最近更新 更多