ocaml函数的定义方法

ocaml函数的定义方法,ocaml,Ocaml,我试图定义函数的类型 (测试,测试)->测试 所以我写下我的代码如下: let test\u func:(测试,测试)->test=fun… 但它给了我语法错误,所以我把它改为 let test\u func:(测试,测试)测试=乐趣… 它不会给我语法错误信息 但是我不知道为什么第一个给了我语法错误 (我也尝试过这种形式。let test\u func(test,test):test这是定义函数的更好方法吗?(test,test)不是有效类型。如果要描述元组类型,正确的语法是test*test。

我试图定义函数的类型

(测试,测试)->测试

所以我写下我的代码如下:

let test\u func:(测试,测试)->test=fun…

但它给了我语法错误,所以我把它改为

let test\u func:(测试,测试)测试=乐趣…

它不会给我语法错误信息

但是我不知道为什么第一个给了我语法错误

(我也尝试过这种形式。
let test\u func(test,test):test
这是定义函数的更好方法吗?

(test,test)
不是有效类型。如果要描述元组类型,正确的语法是
test*test
。但是,我怀疑您实际上想用两个参数来描述函数,这将是
test->test->test
,因为OCaml是一种通用语言

(test,test)test
在语法上是有效的,因为它描述了给定两个参数的参数化类型

let test_func(test,test):test
不指定整个函数类型,只指定返回类型
(test,test)
这里描述了一个元组参数,其中项目分别绑定到
test
test
。我猜您实际上使用了不同的名称,否则这将无法编译

可以分别指定每个参数的类型和返回类型,如下所示:

let test_func (a: test) (b: test): test = ...

此外,这是您发布的第三个问题,您在这里展示了对OCaml中函数如何工作的理解不足,尽管已经解释了好几次。也许你应该复习你的课程材料,以确保你了解curried函数是如何工作的,或者问问老师或能一步一步指导你的人。堆栈溢出确实不能作为教程服务很好地工作。
let test_func:(test,test)test=fun…
也不能编译,因为类型
test
不能同时使用2个参数(在末尾)和0个参数(在父级内部)。