OCaml cons(::)运算符?

Ala*_*n C 12 ocaml cons

在OCaml中,有没有办法自己引用cons运算符?

例如,我可以使用(+)( * )作为int -> int -> int函数,但我不能(::)用作'a -> 'a list -> 'a list函数,如下例所示:

# (+) 3 5;;
- : int = 8
# ( * ) 4 6;;
- : int = 24
# (::) 1 [2;3;4];;
Error: Syntax error: operator expected.
Run Code Online (Sandbox Code Playgroud)

有没有办法产生一个像(::)以外的结果fun x y -> x::y?有谁知道为什么(::)没有在OCaml中实现?

cam*_*ter 13

添加到@seanmcl的答案,

实际上OCaml支持(::)的前缀形式:

# (::)(1, []);;
- : int list = [1]
Run Code Online (Sandbox Code Playgroud)

这是不合理的形式,对应于所有OCaml变体构建体都不是咖喱并且不能部分应用的事实.这是由(::)的特殊解析规则处理的,这就是为什么你得到一个相当奇怪的错误消息Error: Syntax error: operator expected..

更新:

即将推出的OCaml 4.02删除了此解析规则,因此不再可用.


sea*_*mcl 10

No. Cons(::)是构造函数,构造函数不能是中缀运算符.允许的中缀符号在这里:

http://caml.inria.fr/pub/docs/manual-caml-light/node4.9.html

一些解决方法(正如您所提到的)详细说明

(fun x l -> x :: l)
Run Code Online (Sandbox Code Playgroud)

并定义自己的非传统中缀缺点

let (+:) x l = x :: l
Run Code Online (Sandbox Code Playgroud)


Joh*_*son 7

从 Ocaml 4.03 开始​​,您现在可以使用cons(在列表模块中)。即,cons x xs与 相同x :: xs