OCaml中函数声明的语法
我想定义一个函数如下:OCaml中函数声明的语法,ocaml,Ocaml,我想定义一个函数如下: let f (a: int) (b: int) (c: int) (d: int): int = ... 是否可以在不使签名成为元组的情况下使签名更短?因为我仍然希望f有4个参数 多谢各位 Edit1:我只是觉得重复int4次,然后想象一些像let f(a,b,c,d:int):int的东西是没有用的,这在目前实际上是不允许的。试试这个语法: let g: int -> int -> int -> int -> int = fun a b
let f (a: int) (b: int) (c: int) (d: int): int =
...
是否可以在不使签名成为元组的情况下使签名更短?因为我仍然希望f
有4个参数
多谢各位
Edit1:我只是觉得重复int
4次,然后想象一些像let f(a,b,c,d:int):int
的东西是没有用的,这在目前实际上是不允许的。试试这个语法:
let g: int -> int -> int -> int -> int =
fun a b c d ->
assert false
它不会短很多,但是如果你有很多这样的代码,你可以定义
类型arith4=int->int->int->int->int->int
,并使用这个名称作为g
的类型注释,我的OCaml已经生锈了,但是我相信你可以通过声明你自己的类型并在函数体中解包来做到这一点
type four = int*int*int*int
let myfunction (t:four) =
let a, b, c, d = t in
a + b + c + d;
您也可以这样做:
let sum4 ((a, b, c, d):int*int*int*int) =
a + b + c + d;;
我将函数中的“我仍然希望f有4个参数”解释为确切地表示这不是一个可接受的解决方案。@Pascal Cuoq:我考虑过这一点,但我觉得这可能是询问者和任何其他人(可能有不同要求)的合理选择(折衷)这可能会碰到这个问题。如果您的目的是使用类型别名来避免在类似函数中重复相同的类型,那么您也可以使用curry样式<代码>键入'a four=int->int->int->int->int->int->a代码>。您不需要用其类型注释所有参数。通常不需要。您可以在模块接口中强制执行类型,但由于它不是预期的编程风格,因此语法没有针对它进行优化。注释适用于多态变体,但在其他方面,您不必太多地使用它们。我发现gasche的“语法没有针对多态变体进行优化,因为它不是预期的编程风格”评论很有见地。一个与他的一般规则并不矛盾的小例外是,当编译器拒绝一个长的递归定义时,一个小的类型注释可以非常有助于编译器使用相关的错误消息来帮助您修复它。@gasche“语法未优化”到底是什么意思?如何优化或不优化语法?设计语法需要做出许多折衷,使某些东西比其他东西更难表达。我想说的是,当语法尽可能简短时,它针对特定用法进行了“优化”。例如,OCaml的语法针对curried函数和“if-then-else”表达式的链接进行了“优化”,而没有“elif”关键字,相反,它并不能很好地支持中缀运算符第二个参数的部分应用,也不能在本地声明异常。