-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.
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>
3条答案
按热度按时间nwwlzxa71#
在我看来,这个问题指的是
lists:map/2
的实现,lists:map/2
是一个将同一个函数(作为参数接收)应用于列表的所有元素并返回结果列表的函数。换句话说,这个函数。
你可以查看OTP Github repo来了解这个函数是如何实现的:
或者,您可以设想一个更 * 简单 * 的实现,如...
这两种方法(对于OTP版本,我指的是
map_1/2
)都在函数子句头中使用模式匹配来区分函数的基本情况和递归步骤。您收到的请求是使用带有
case
子句的单个函数子句而不是上面看到的两个函数子句来实现相同的算法。cwxwcias2#
下面是一个简单的例子,展示了如何使用function子句,然后使用case语句来做同样的事情。将下面的代码放在某个目录下名为
a.erl
的文件中:请注意,文件名
a.erl
和模块指令:所以,如果你把文件命名为
homework1.erl
,那么文件中的module指令必须是:为了保存大量的输入,最好使用非常短的模块名(正如您将在下面看到的)。
在终端窗口中,将目录切换到包含
a.erl
的目录:然后启动erlang shell:
接下来,执行以下语句:
注意调用文件/模块中定义的函数的语法:
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]
的列表。您的函数应该在这些参数上给予相同的结果。