我有这个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);;
有人可以帮助我吗?
答案 0 :(得分:3)
好的,让我们评估一下fun f [x; y; z] -> (f x y), (f z)
的类型。
_ -> _ -> _ * _
,其中下划线尚未评估部分。我们将在下面评估它们x
,y
和z
的类型是相同的。
_ -> 'a list -> _ * _
f x y
)中的第一个表达式时,我们看到f
已应用于x
和y
,因此我们可以将结果重写为:
('a -> 'a -> 'b) -> 'a list -> 'b * _
f z
。但我们已经知道f
已经'a -> 'a -> 'b
,因此似乎f z
的类型为'a -> 'b
。
('a -> 'a -> 'b) -> 'a list -> 'b * ('a -> 'b)
答案 1 :(得分:0)
这是一个肯定的清单。它不可能是其他任何东西。
你的函数接受两个参数。第一个是函数,第二个是列表,它被解构为三个值。该函数接受两个参数。由于OCaml中的所有函数都被currified,它也可以接受一个参数和" return"一个接受另一个参数并产生结果的函数。
因此,最后你有一对函数f
应用于列表的前两个元素的结果,以及将相同函数部分应用于列表的第三个元素。
希望,这可以回答你的问题。