试图在Erlang中组合列表的问题

时间:2011-02-28 05:37:14

标签: list erlang

作为学习Erlang的练习,我正在尝试编写一个简单的数据库(来自O'Reilly的编程Erlang)。

基本上我有一个像这样的元组列表:

Db1 = [{person1,charleston},{person2,charleston},{person3,chicago}].

我需要创建这样的功能

db:match(charleston,Db1).

返回

[person1,person2]

这是我写的方法:

match(Element, Db) -> match(Element, Db, []).
match(_Element,[], Results) -> Results;
match(Element, [{Key,Value}|T], Results) ->
    case Value == Element of
        true -> match(Element, T, [Results,Key]);
        false -> match(Element,T,Results)
    end.

我得到的结果是:

[[[],person1],person2]

我知道有一些方法可以将列表与lists.erl模块组合在一起,但我试图绕过它以努力了解有关该语言的更多信息。我有什么想法吗?

3 个答案:

答案 0 :(得分:7)

你正在重新发明轮子。只需使用list comprehension

match(X, Db) -> [P || {P, E} <- Db, E == X].

答案 1 :(得分:5)

问题是如何构建列表,请尝试这样做:

case Value == Element of
    true -> match(Element, T, [Key|Results]);
    false -> match(Element,T,Results)
end.
  • [A,B]使用元素A和B构建新列表。
  • [A | B]将A添加到列表B中。

答案 2 :(得分:1)

直接编写代码的另一种方法是

match(_Value, []) -> [];
match(Value, [{Key,Value}|T]) ->
    [Key|match(Value, T)];
match(Value, [_|T]) ->
    match(Value, T).

@Little Bobby Tables解决方案中的列表理解等同于此。

相关问题