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