Ocaml f[x;y;z]->;(f x y)、(f z);;
我有一个OCaml函数: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
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)
- 瞧李>
f
应用于列表的前两个元素的结果,以及相同函数的部分应用于列表的第三个元素的结果
希望,这回答了您的问题。这是一个列表,因此x、y和z的类型必须相同。谢谢。我还有两个问题:1:在步骤3中,你的意思是“我们看到f应用于x和y”而不是“我们看到f应用于x和z”?2:FZ的类型是'a->'b,因为它仍然缺少一个参数,我知道它会因为Fxy而弄乱一个参数(我看到f需要两个参数:x和y)?2:我想你是对的。很难正确地表述它,因为这些函数都是咖喱形式的,从技术上讲,所有函数都只有一个参数。