concurrency - Erlang 并发编程
问题描述
编写一个不带参数的名为calculator 的Erlang 函数。该函数在进程中运行时应该等待接收消息。如果消息是四项元组的形式:{ Pid, Operand, X, Y }
,请执行以下操作:
- 如果 Operand 是 add,则向 Pid 发送一条消息,其中包含 X 和 Y 相加的结果。
- 如果操作数是减法,则向 Pid 发送一条消息,其中包含从 X 中减去 Y 的结果。
- 如果操作数是乘法,则向 Pid 发送一条消息,其中包含 X 和 Y 相乘的结果。
- 如果操作数是除数,则向 Pid 发送一条消息,其中包含 X 除以 Y 的结果。
然后,重新运行该函数。
如果消息是元组的形式,有两个项目:{ Pid, terminate },然后向完成的 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} ->
...
通常,为此目的,使用 atom likeadd
而不是 string like"add"
您应该有一个功能可以calculate/0
在单独的进程中启动该功能:
start() ->
spawn(fun() -> calculate() end).
推荐阅读
- php - 如何在 Symfony 4 中使用 fos 用户将用户迁移到新的密码哈希算法?
- multithreading - 并行计算中的单例瓶颈
- javascript - 仅在父项上捕获或取消 JS 滚轮事件 - 而不是子项
- python - 在 Python 中为线性拟合(带有两个参数)生成置信区间等高线图
- haskell - Haskell中函数名称后的单引号/撇号(')是什么意思?
- python - 如何将轮廓扩大特定数量的像素(不迭代每个像素)?
- python - 如何迭代时间序列行并获取特定值的时间戳?
- mysql - 我正在尝试在 mysql 中进行动态支点
- css - 在不拉伸的情况下将静态 Google Map API 调整为自定义大小
- google-bigquery - 标准 SQL 查询效率