在 Erlang 中使用 case 子句而不是函数子句实现 lists:map
Implement a lists:map using case clauses instead of function clauses in Erlang
谁能告诉我这是什么意思?我是新手,我的朋友推荐我到这个网站的 post。
顺便说一下,我是 Erlang 的新手。
如果可能的话,我想在编辑器中编写代码,但我什至不理解任何示例 input/output 的问题以及它是如何工作的,一个解释就可以了。谢谢
在我看来,问题是指 lists:map/2
的实现,该函数将相同的函数(作为参数接收)应用于列表的所有元素,并 returns 结果列表。
换句话说,this function.
您可以查看 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
)都在函数子句头部使用 pattern-matching 来区分函数的基本情况和递归步骤。
您收到的请求是使用带有 case
子句的单个函数子句而不是上面看到的两个函数子句来实现相同的算法。
any sample input/output and how it works an explanation will do
在 Brujo Benavides 的回答中链接的文档中,您可以看到:
Takes a function from As to Bs, and a list of As and produces a list of Bs by applying the function to every element in the list. This function is used to obtain the return values.
因此 F
是一个函数(具有单个参数),例如 fun(X) -> X*2 end
。请参阅 https://www.erlang.org/doc/programming_examples/funs.html#syntax-of-funs or 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]
和 return 的每个元素调用 fun(X) -> X*2 end
return 值 [2,4,6]
的列表。您的函数应该对这些参数给出相同的结果。
这里有一个简单的例子,展示了如何使用函数子句,然后使用 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(homework1).
为了节省大量输入,最好使用非常短的模块名称(如下所示)。
在终端 window 中,将目录切换到包含 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>
请注意调用 file/module 中定义的函数的语法:
module_name:function_name(arg1, arg2, ... argn).
谁能告诉我这是什么意思?我是新手,我的朋友推荐我到这个网站的 post。 顺便说一下,我是 Erlang 的新手。
如果可能的话,我想在编辑器中编写代码,但我什至不理解任何示例 input/output 的问题以及它是如何工作的,一个解释就可以了。谢谢
在我看来,问题是指 lists:map/2
的实现,该函数将相同的函数(作为参数接收)应用于列表的所有元素,并 returns 结果列表。
换句话说,this function.
您可以查看 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
)都在函数子句头部使用 pattern-matching 来区分函数的基本情况和递归步骤。
您收到的请求是使用带有 case
子句的单个函数子句而不是上面看到的两个函数子句来实现相同的算法。
any sample input/output and how it works an explanation will do
在 Brujo Benavides 的回答中链接的文档中,您可以看到:
Takes a function from As to Bs, and a list of As and produces a list of Bs by applying the function to every element in the list. This function is used to obtain the return values.
因此 F
是一个函数(具有单个参数),例如 fun(X) -> X*2 end
。请参阅 https://www.erlang.org/doc/programming_examples/funs.html#syntax-of-funs or 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]
和 return 的每个元素调用 fun(X) -> X*2 end
return 值 [2,4,6]
的列表。您的函数应该对这些参数给出相同的结果。
这里有一个简单的例子,展示了如何使用函数子句,然后使用 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(homework1).
为了节省大量输入,最好使用非常短的模块名称(如下所示)。
在终端 window 中,将目录切换到包含 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>
请注意调用 file/module 中定义的函数的语法:
module_name:function_name(arg1, arg2, ... argn).