作为学习Erlang的练习,我正在尝试编写一个简单的数据库(来自O'Reilly的Programming Erlang).
基本上我有一个像这样的元组列表:
Db1 = [{person1,charleston},{person2,charleston},{person3,chicago}].
Run Code Online (Sandbox Code Playgroud)
我需要创建这样的功能
db:match(charleston,Db1).
Run Code Online (Sandbox Code Playgroud)
回报
[person1,person2]
Run Code Online (Sandbox Code Playgroud)
这是我写的方法:
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.
Run Code Online (Sandbox Code Playgroud)
我得到的结果是:
[[[],person1],person2]
Run Code Online (Sandbox Code Playgroud)
我知道有一些方法可以将列表与lists.erl模块结合起来,但我试图绕过它以便更多地了解该语言.我有什么想法我做错了吗?
你正在重新发明轮子.只需使用列表理解:
match(X, Db) -> [P || {P, E} <- Db, E == X].
Run Code Online (Sandbox Code Playgroud)
小智 5
问题是如何构建列表,请尝试以下方法:
case Value == Element of
true -> match(Element, T, [Key|Results]);
false -> match(Element,T,Results)
end.
Run Code Online (Sandbox Code Playgroud)