Ocaml有趣的f [x; Ÿ; z] - > (f x y),(f z);;

时间:2014-06-11 07:58:39

标签: ocaml type-inference

我有这个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);;

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:3)

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

  • 我们的函数接受参数并返回一个元组。所以它的类型将是_ -> _ -> _ * _,其中下划线尚未评估部分。我们将在下面评估它们
  • 我们的第二个参数是一个列表,因此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)
  • Etvoilà!

答案 1 :(得分:0)

这是一个肯定的清单。它不可能是其他任何东西。

你的函数接受两个参数。第一个是函数,第二个是列表,它被解构为三个值。该函数接受两个参数。由于OCaml中的所有函数都被currified,它也可以接受一个参数和" return"一个接受另一个参数并产生结果的函数。

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

希望,这可以回答你的问题。