Erlang Thursday – queue:cons/2

今天的Erlang Thursday我们稍微深入一下queue模块,我们讲讲来自Okazaki的API:queue:cons/2

queue:cons/2 有两个入参,一个是元素,一个是队列,它执行后返回一个元素加在队列头部形成的新队列。

1
2
3
4
5
6
7
8
queue:cons(7, queue:new()).
% {[],[7]}
queue:cons(3, queue:cons(7, queue:new())).
% {[7],[3]}
queue:cons(nil, queue:new()).
% {[],[nil]}
queue:cons(5, queue:from_list([7, 9, 13, 21])).
% {[21],[5,7,9,13]}

如果我们传入一个列表给 queue:cons/2 ,我们看到它出错,表明它想要一个队列,而不会隐式地将一个列表转成一个队列。

1
2
3
4
queue:cons(5, [1, 2, 3, 4]).
% ** exception error: bad argument
% in function queue:in_r/2
% called as queue:in_r(5,[1,2,3,4])

因为队列被设置成一个双端队列,Okasaki API 也提供了一个对应的函数 queque:snoc/2 ,它将元素加在传入的队列的尾部。注意,queue:snoc/2 和 queue:cons/2 两个函数的两个入参的顺序也是相反的;queue:snoc/2 的第一个入参上一个队列,而要加在它尾部的元素做为第二个入参。

1
2
3
4
5
6
7
8
queue:snoc(queue:new(), 5).
% {[5],[]}
queue:snoc(queue:from_list([7]), 5).
% {[5],[7]}
queue:snoc(queue:snoc(queue:new(), 7), 5).
% {[5],[7]}
queue:snoc(queue:from_list([7, 9, 13, 21]), 5).
% {[5,21],[7,9,13]}

原文链接: https://www.proctor-it.com/erlang-thursday-queue-cons-2/