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

Mic*_*cah 1 erlang list

作为学习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模块结合起来,但我试图绕过它以便更多地了解该语言.我有什么想法我做错了吗?

Lit*_*les 7

你正在重新发明轮子.只需使用列表理解:

match(X, Db) -> [P || {P, E} <- Db, E == X].
Run Code Online (Sandbox Code Playgroud)

  • 模式匹配更短:匹配(X,Db) - > [P || {P,X} < - Db]. (2认同)
  • @hdima该解决方案不起作用,因为List Comprehensions生成器中的X将遮蔽match/2参数X. (2认同)

小智 5

问题是如何构建列表,请尝试以下方法:

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

  • `Key`是一个值,而`Results`是一个值列表.`[_ | _]`结构通常以`[Value | ListofValues]`的方式用于**将第一部分添加到第二部分.以相反的顺序使用它是合法的,但它不是使用列表的常规方法,并且不支持这一点.将值附加到列表是另一种效率低得多的操作,如果可能的话通常会避免这种操作. (2认同)