尝试在 Erlang 中组合列表时出现问题

发布于 2024-10-19 12:29:09 字数 777 浏览 3 评论 0原文

作为学习 Erlang 的练习,我正在尝试编写一个简单的数据库(来自 O'Reilly 的《Programming 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]

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

As an exercise in learning Erlang, I'm trying to write a simple database (from O'Reilly's Programming Erlang).

Basically I have a list of Tuples like this:

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

I need to create function such that

db:match(charleston,Db1).

returns

[person1,person2]

Here's the method that I wrote:

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.

The result I'm getting back is this:

[[[],person1],person2]

I know there are ways of combining lists with the lists.erl module, but I'm trying to bypass it in an effort to learn more about the language. Any ideas what I'm doing wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

南笙 2024-10-26 12:29:09

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

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

You're re-inventing the wheel. Just use list comprehension:

match(X, Db) -> [P || {P, E} <- Db, E == X].
—━☆沉默づ 2024-10-26 12:29:09

问题在于如何构建列表,请尝试以下操作:

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

the problem is how you are building up your list, try this instead:

case Value == Element of
    true -> match(Element, T, [Key|Results]);
    false -> match(Element,T,Results)
end.
  • [A,B] builds a new list with elements A and B.
  • [A|B] prepends A to the list B.
抚你发端 2024-10-26 12:29:09

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

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

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

An alternate way to write the code directly is

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

The list comprehension in @Little Bobby Tables solution is equivalent to this.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文