Concurrency Erlang并发编程

Concurrency Erlang并发编程,concurrency,erlang,Concurrency,Erlang,编写一个名为calculator的Erlang函数,该函数不带任何参数。该函数在进程中运行时,应等待接收消息。如果消息是四项元组的形式:{Pid,operator,X,Y},请执行以下操作: 如果操作数为“添加”,则向Pid发送一条消息,其中包含添加X和Y的结果 如果操作数是减法运算,则向Pid发送一条消息,其中包含从X减去Y的结果 如果操作数为乘法,则向Pid发送一条消息,其中包含X和Y相乘的结果 如果操作数为除法,则向Pid发送一条消息,其中包含X除以Y的结果 然后,重新运行该函数 如

编写一个名为calculator的Erlang函数,该函数不带任何参数。该函数在进程中运行时,应等待接收消息。如果消息是四项元组的形式:
{Pid,operator,X,Y}
,请执行以下操作:

  • 如果操作数为“添加”,则向Pid发送一条消息,其中包含添加X和Y的结果
  • 如果操作数是减法运算,则向Pid发送一条消息,其中包含从X减去Y的结果
  • 如果操作数为乘法,则向Pid发送一条消息,其中包含X和Y相乘的结果
  • 如果操作数为除法,则向Pid发送一条消息,其中包含X除以Y的结果
然后,重新运行该函数

  • 如果消息的形式是包含两个项的元组:{Pid,terminate},则将消息发送到done的Pid。不要重新运行该函数

  • 如果消息是任何其他形式,请忽略它并重新运行该函数

我的代码:

calculate() ->
  receive
    {Pid, Operand, X, Y} 
      if 
         Operand == "add" -> Pid ! X+Y
         Operand == "substract" -> Pid ! Y - X
         Operand == "multiply" -> Pid ! X*Y
         Operand == "divide" -> Pid ! X/Y
    {Pid, terminate} -> Pid ! "done"
    _ -> calculate();
  end.

有人能帮我解决这个问题吗?

您的代码没有编译,您应该先看看基本的erlang语法

我给你一些线索:

对于您的问题,不应该使用
if
语句,而应该像中一样使用模式匹配

receive
    {From,add,X,Y} ->
        From ! X+Y,
        calculate();
    {From,sub,X,Y} -> 
    ...
通常,为此,使用原子(如
add
)而不是字符串(如
“add”

您应该有一个函数,可以在单独的过程中启动函数
calculate/0

start() ->
    spawn(fun() -> calculate() end).

您应该查看帮助,以更友好的方式编辑和格式化您的问题。