gpt4 book ai didi

list - 如何在 Erlang 中使用闭包?

转载 作者:行者123 更新时间:2023-12-04 17:23:50 35 4
gpt4 key购买 nike

我有两个列表:L 和 E。我尝试编写一个函数,它返回另一个列表,其中包含 L 中 E 中元素的出现次数。

-module(mymodule).
-export([count/2]).
-export([numberOfOccurences/2]).

count([Head|Tail], Counter) ->
fun(Element) -> if
[Head|Tail] == [] -> Counter;
Element == Head -> count(Tail, Counter + 1);
Element /= Head -> count(Tail, Counter)
end
end.

numberOfOccurences(L, E) ->
lists:map(count(L, 0), E).
mymodule:numberOfOccurences[1,2,"abc",2,1,"abc",4,1,1], [1,2,3,"abc"])应该返回 [4,2,0,2] .但它返回一个包含 4 个函数的列表。我究竟做错了什么?

最佳答案

这里发生的事情是,如果我们展开这张 map ,count(L, 0)首先被调用,然后将产生的乐趣传递给 lists:map .当这个结果的乐趣被映射到 E 的每个成员时,并且被传递给匿名函数,大多数元素的返回值是调用 count(Tail,Counter) 的结果,它返回一个函数。

这是您的函数的重写版本。最重要的是

  • 我修复了基本情况,否则,当空集传递给 count() 时,您可能会遇到匹配错误。 ,更重要的是,
  • 在你的闭包中,为了保证正确的递归,你需要调用count()的返回值,所以我存储 count() 的结果调用F ,然后使用传递的元素调用该函数。

  • 所以这里是更新的模块:
    -module(mymodule).
    -export([count/2]).
    -export([numberOfOccurences/2]).

    count([],Counter) ->
    fun(_) -> Counter end;
    count([Head|Tail], Counter) ->
    fun(Element) ->
    if
    Element == Head ->
    F = count(Tail, Counter + 1),
    F(Element);
    Element /= Head ->
    F = count(Tail, Counter),
    F(Element)
    end
    end.

    numberOfOccurences(L, E) ->
    lists:map(count(L, 0), E).

    结果:
    > mymodule:numberOfOccurences([1,2,"abc",2,1,"abc",4,1,1], [1,2,3,"abc"]).
    [4,2,0,2]

    关于list - 如何在 Erlang 中使用闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14371884/

    35 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com