我是Erlang的新手,我已经完成了代码,但是我需要正确的答案格式来回答这个问题。这是我的代码。如果我输入了任何整数,那么它必须给那个数字加1。如果给出了字符或浮点数或任何其他非整数,它应该退出这个过程。
-module(a).
-export([start/0,func1/1]).
func1(List) when is_integer(List) -> io:format("~p~n",[List+1]);
func1(List) when is_atom(List) -> io:format("Exit~n");
func1(List) when is_binary(List) -> io:format("Exit~n");
func1(List) when is_list(List) -> io:format("Exit~n");
func1(List) when is_map(List) -> io:format("Exit~n");
func1(List) when is_float(List) -> io:format("Exit~n").
start() ->
spawn(a, func1, [45]),
spawn(a, func1, [test]).
这段代码工作正常,但我需要这样做,在乒乓格式的东西像接收和结束像传递消息。请让我知道正确的答案,并提前感谢。
下面是我看了评论后的尝试。
-module(a).
-compile(export_all).
f1() ->
receive
List ->
io:format("~p~n", [List+1]);
_ ->
io:format("Exit~n")
end.
f2() ->
receive
{From, List} ->
From ! "~p~n" ,[List+1];
_ ->
io:format("Exit~n")
end.
f3() ->
receive
{From, List} ->
From ! "~p~n" , [List+1],
f3();
_ ->
io:format("Exit~n"),
f3()
end.
1条答案
按热度按时间1qczuiv01#
首先,你不必为每一个非整数类型定义一个函数子句。关键是要意识到函数子句是按顺序测试的。你的第一个函数子句测试参数是否是整数。这意味着如果erlang到达你的第二个函数子句,那么你就知道参数不是整数--不需要做任何类型检查。所以,对第二个函数子句中的所有非整数参数执行您需要执行的操作。
其次,当自变量可以是整数、原子、元组、二进制等时,将自变量命名为
List
是没有意义的。这段代码工作正常,但我需要以乒乓格式来做这件事,比如接收和结束,比如传递消息。
然后,您需要启动另一个进程,而不向它发送任何参数,然后使另一个进程进入递归循环/函数。在递归循环/函数中,您需要的唯一语句是
receive statement
,它将暂停,直到收到消息。主进程可以使用
send()
向其他进程发送消息。您需要定义一个用户函数,如increment_number(Number)
。在increment_number(Number)
中,您将调用send()
向其他进程发送消息,然后下一个语句将是receive,它将等待来自其他进程的返回消息。我是非常新的Erlang,所以我不知道对不起。
所有开始Erlang编程的书籍都告诉你如何创建多个相互对话的进程。我推荐"编程Erlang"--阅读关于并发的相关章节。
您将不得不花费很多很多小时来阅读基本的并发示例,玩它们,然后尝试将它们改编为自己的使用。
下面是我看了评论后的尝试。
通常,消息作为元组传递,例如
或者,等同地:
然后,另一个进程在receive子句中匹配消息:
在执行完某个任务后,接收进程需要向发送进程返回一条消息,即包含某个算术计算结果的消息。而且,因为您希望接收进程能够处理不确定数量的消息和后续计算,所以您希望创建一个无限循环。在erlang中,您可以使用递归函数来实现这一点: