Ocaml f[x;y;z]->;(f x y)、(f z);;

Ocaml f[x;y;z]->;(f x y)、(f z);;,ocaml,type-inference,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

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

有人能帮我吗?

好的,让我们来评估一下
fun f[x;y;z]->(fxy)、(fz)

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

这是一个肯定的列表。这不可能是别的

函数接受两个参数。第一个是函数,第二个是列表,分解为三个值。该函数接受两个参数。因为OCaml中的所有函数都是货币化的,所以它也可以接受一个参数并“返回”一个函数,该函数将接受另一个参数并产生一个结果

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


希望,这回答了您的问题。

这是一个列表,因此x、y和z的类型必须相同。谢谢。我还有两个问题:1:在步骤3中,你的意思是“我们看到f应用于x和y”而不是“我们看到f应用于x和z”?2:FZ的类型是'a->'b,因为它仍然缺少一个参数,我知道它会因为Fxy而弄乱一个参数(我看到f需要两个参数:x和y)?2:我想你是对的。很难正确地表述它,因为这些函数都是咖喱形式的,从技术上讲,所有函数都只有一个参数。