作为学习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
模块组合在一起,但我试图绕过它以努力了解有关该语言的更多信息。我有什么想法吗?
答案 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.
答案 2 :(得分:1)
直接编写代码的另一种方法是
match(_Value, []) -> [];
match(Value, [{Key,Value}|T]) ->
[Key|match(Value, T)];
match(Value, [_|T]) ->
match(Value, T).
@Little Bobby Tables解决方案中的列表理解等同于此。