17

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

例如,我可以将(+)and( * )用作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.

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

4

3 回答 3

14

添加到@seanmcl的答案,

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

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

这是非柯里化形式,对应于所有 OCaml 变体构造函数都没有柯里化且不能部分应用的事实。这是由专门针对 (::) 的特殊解析规则处理的,这就是为什么您会收到一条相当奇怪的错误消息的原因Error: Syntax error: operator expected.

更新:

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

于 2013-10-21T03:45:09.697 回答
11

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

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

一些解决方法是(正如你提到的)冗长的

(fun x l -> x :: l)

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

let (+:) x l = x :: l
于 2013-10-20T14:27:23.633 回答
4

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

于 2018-08-21T10:38:18.367 回答