在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中实现?
答案 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模块中)。也就是说,cons
与cons x xs
相同。