OCaml中函数声明的语法

9

I would like to define a function as following:

let f (a: int) (b: int) (c: int) (d: int): int =
  ...

有没有可能在不把它们变成元组的情况下使签名更短?因为我仍然希望 f 有4个参数。
非常感谢。 编辑1:我认为重复4次的 int 是无用的,并且想象一下像 let f(a, b, c, d: int): int 这样的东西实际上目前是不允许的。

4
你不需要用类型注释来标注所有的参数,通常情况下这并不是必须的。你可以在模块接口中强制使用类型,但是除此之外,语法并没有针对类型优化,因为这不是预期的编程风格。类型注释对于多态变量来说非常有用,但是除此之外,你不应该经常使用它们。 - gasche
5
我认为Gasche的“语法不是为此进行优化,因为这不是预期的编程风格”这一评论很有见地。一个小例外并不违反他的一般规则,就是当编译器拒绝长递归定义时,一个小的类型注释可以非常帮助编译器通过相关的错误信息帮助你修复它。 - Pascal Cuoq
@gasche,“语法不优化”具体是什么意思?语法怎么会被优化或不被优化? - Thomas Vanhelden
设计语法需要做出许多妥协,使一些事情比其他事情更难表达。我会说当语法尽可能地缩短时,它就针对特定用途进行了“优化”。例如,OCaml的语法针对柯里化函数和链式“if then else”表达式进行了“优化”,而相反,它不太擅长支持中缀运算符的第二个参数的部分应用,或者在本地声明异常。 - gasche
2个回答

13

尝试使用这个语法:

let g: int -> int -> int -> int -> int =
  fun a b c d -> 
     assert false

虽然不太短,但如果你有很多这样的东西,你可以定义 type arith4 = int -> int -> int -> int -> int 并将该名称用作 g 的类型注释。


1

我的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;;

2
我理解函数中的“I still want f to have 4 arguments.”的意思是,这不是一个可接受的解决方案。 - Pascal Cuoq
@Pascal Cuoq:我考虑过这个,但我觉得这可能是一个合理的替代方案(妥协),适用于提问者和其他可能遇到这个问题的人(他们可能有不同的要求)。 - Cristian Sanchez
1
如果您的目的是使用类型别名来避免为类似函数重复相同的类型,您也可以使用柯里化风格来实现。 type 'a four = int -> int -> int -> int -> 'a;; - gasche

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接