OCaml cons(::)运算符?

时间:2013-10-20 13:18:51

标签: 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之类的结果?有没有人知道为什么{0}没有在OCaml中实现?

3 个答案:

答案 0 :(得分:13)

添加@seanmcl的答案,

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

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

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

更新

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

答案 1 :(得分:9)

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

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

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

(fun x l -> x :: l)

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

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

答案 2 :(得分:2)

从Ocaml 4.03开始,您现在可以使用getMeeting(req, res) { var Q = Meeting.findById(req.params.idMeeting,''); // my first guess Q.populate('teams.participants.item'); // second guess adding some more deep population // Q.populate({ path: 'teams.participants.item', populate: { path: 'user', select: 'desc' } }); // also tried // Q.populate({ path: 'teams', populate: { path: 'participants.item' } }); // Q.populate({ path: 'teams', populate: { path: 'participants', populate: { path: 'item' } } }); Q.exec(function(err, doc) { if (err) { console.error(err); return res.json({ status: false, data: { err: "Data base error." } }); } if (doc) { return res.json({ status: true, data: doc }); } else { return res.json({ status: false, data: { err: "No document match." } }); } }); } (在List模块中)。也就是说,conscons x xs相同。