2013-10-20 44 views
10

在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. 

有没有产生像(::)结果的方式除了fun x y -> x::y?有没有人知道为什么(::)没有在OCaml中实现?

+0

如果用圆括号包围参数,它就会起作用,如下所示:'(::)(1,[2; 3; 4]);;' –

回答

9

编号缺点(::)是一个构造函数,构造函数不能是中缀运算符。允许的缀符号在这里:

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

一些解决方法是(你提到)的详细

(fun x l -> x :: l) 

和定义自己的非传统缀缺点

let (+:) x l = x :: l 
+0

作为参考,知识由[http:// caml.inria.fr/pub/docs/manual-ocaml-4.00/expr.html#toc50]部分变体。 – Gqqnbig

13

添加到@seanmcl的回答,

其实OCaml的支持的(一个前缀形式::):

# (::)(1, []);; 
- : int list = [1] 

这在uncurried形式,事实上,所有的变体OCaml的构造不咖喱并且不能被部分地施加对应。这是通过一个特殊的解析规则处理(::),这就是为什么你得到了一个相当奇怪的错误消息Error: Syntax error: operator expected.

更新:

即将OCaml的4.02删除此分析规则,因此,这是不再可用。