在Erlang中使用case子句而不是function子句实现lists:map

e4eetjau  于 2022-12-16  发布在  Erlang
关注(0)|答案(3)|浏览(137)

有人能告诉我这是什么意思吗?我是新来的,我的朋友推荐我在这个网站上发帖。顺便说一句,我是新来的。
如果可能的话,我想写一个代码在编辑器,我甚至不明白的问题,任何样本输入/输出和它是如何工作的解释会做.谢谢

nwwlzxa7

nwwlzxa71#

在我看来,这个问题指的是lists:map/2的实现,lists:map/2是一个将同一个函数(作为参数接收)应用于列表的所有元素并返回结果列表的函数。
换句话说,这个函数。
你可以查看OTP Github repo来了解这个函数是如何实现的:

map(F, List) when is_function(F, 1) ->
    case List of
        [Hd | Tail] -> [F(Hd) | map_1(F, Tail)];
        [] -> []
    end.

map_1(F, [Hd | Tail]) ->
    [F(Hd) | map_1(F, Tail)];
map_1(_F, []) ->
    [].

或者,您可以设想一个更 * 简单 * 的实现,如...

map(F, []) -> [];
map(F, [H|T]) -> [F(H) | map(F, T)].

这两种方法(对于OTP版本,我指的是map_1/2)都在函数子句头中使用模式匹配来区分函数的基本情况和递归步骤。
您收到的请求是使用带有case子句的单个函数子句而不是上面看到的两个函数子句来实现相同的算法。

cwxwcias

cwxwcias2#

下面是一个简单的例子,展示了如何使用function子句,然后使用case语句来做同样的事情。将下面的代码放在某个目录下名为a.erl的文件中:

-module(a).
-export([show_stuff/1, show_it/1]).

show_stuff(1) ->
    io:format("The argument was 1~n");
show_stuff(2) ->
    io:format("The argument was 2~n");
show_stuff(_)->
    io:format("The argument was something other than 1 or 2~n").

show_it(X) ->
    case X of
        1 -> io:format("The argument was 1~n");
        2 -> io:format("The argument was 2~n");
        _ -> io:format("The argument was something other than 1 or 2~n")
    end.

请注意,文件名a.erl和模块指令:

-module(a).

所以,如果你把文件命名为homework1.erl,那么文件中的module指令必须是:

-module(homework1).

为了保存大量的输入,最好使用非常短的模块名(正如您将在下面看到的)。
在终端窗口中,将目录切换到包含a.erl的目录:

~$ cd erlang_programs/

然后启动erlang shell:

~/erlang_programs$ erl
Erlang/OTP 24 [erts-12.0.2] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1]

Eshell V12.0.2  (abort with ^G)

接下来,执行以下语句:

1> c(a).   <--- Compiles the code in your file 
{ok,a}     <--- Or, you may get errors which must be corrected, then try recompiling.

2> a:show_stuff(1).
The argument was 1
ok

3> a:show_stuff(4).
The argument was something other than 1 or 2
ok

4> a:show_it(1).
The argument was 1
ok

5> a:show_it(4).
The argument was something other than 1 or 2
ok

6>

注意调用文件/模块中定义的函数的语法:

module_name:function_name(arg1, arg2, ... argn).
ktca8awb

ktca8awb3#

任何示例输入/输出以及它是如何工作的,都需要解释
在Brujo Benavides答案中链接的文档中,您可以看到:
获取一个从As到Bs的函数和一个A的列表,并通过将该函数应用于列表中的每个元素来生成一个B的列表。此函数用于获取返回值。
因此,F是一个类似于fun(X) -> X*2 end的函数(具有单个参数)。请访问https://www.erlang.org/doc/programming_examples/funs.html#syntax-of-funs或https://www.erlang.org/doc/reference_manual/expressions.html#funs了解fun表达式。List1是函数F可以处理的值列表(在本例中为数字),例如[1,2,3]。然后list:map(fun(X) -> X*2 end, [1,2,3])在列表[1,2,3]的每个元素上调用fun(X) -> X*2 end,并返回返回值[2,4,6]的列表。您的函数应该在这些参数上给予相同的结果。

相关问题