在Erlang中,如何在函数参数中解压缩元组列表?

pbwdgjma  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(131)

我有要求

add_items(AuctionId, [{Item, Desc, Bid}]) -> {ok, [{ItemId, Item]} | {error, unknown_auction}.

如何使用元组列表编写函数体?
我尝试过:

add_items(AuctionId, ItemList) -> ...

这样做很好,但是我还没有匹配需求--但是如果我这样定义它,需求会返回function_clause错误,因为它不能进行模式匹配(而且我认为问题也不希望我这样定义规范,因为我会写这样的内容

-spec add_items(reference(), [item_info()]) -> 
{ok, [{itemid(), nonempty_string()}]} | {error, unknown_auction()}.

这也不符合用ala []和[H]的头和尾进行递归定义的情况|T]

l7mqbcuq

l7mqbcuq1#

以下是您可以执行的操作示例:

-module(a).
-compile(export_all).

%%add_items(AuctionId, [{Item, Desc, Bid}]) -> 
                     {ok, [{ItemId, Item]} | {error, unknown_auction}.

add_items(AuctionId, Items) ->
    case valid_auction(AuctionId) of
        true -> insert_items(Items, _Results=[]);
        false -> {error, unknown_auction}
    end.

%% Here you should check the db to see if the AuctionId exists:
valid_auction(AuctionId) ->
    ValidAuctionIds = sets:from_list([1, 2, 3]),
    sets:is_element(AuctionId, ValidAuctionIds).

%% Here's a recursive function that pattern matches the tuples in the list:
insert_items([ {Item, Desc, Bid} | Items], Acc) ->
    %%Insert Item in the db here:
    io:format("~w, ~w, ~w~n", [Item, Desc, Bid]),
    ItemId = from_db,
    insert_items(Items, [{ItemId, Item} | Acc]);
insert_items([], Acc) ->
    lists:reverse(Acc).

在 shell 中:

8> c(a).                                
a.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,a}

9> a:add_items(4, [{apple, fruit, 10}]).
{error,unknown_auction}

10> a:add_items(1, [{apple, fruit, 10}, {cards, game, 1}]).
apple, fruit, 10
cards, game, 1
[{from_db,apple},{from_db,cards}]

11>

shell交互表明add_items()满足您的要求:
1.它有两个参数,第二个参数是一个列表,其元素是三个元素元组。
1.返回值是包含两个元素元组的列表的ok元组;或者元组{error,unknown_auction}

相关问题