Concurrency 二郎市的连通性
我试图解决的问题如下: 编写一个名为print_message的Erlang函数,该函数不带任何参数。函数应等待接收消息。收到消息时(可以是任何Erlang术语),使用io:format()打印消息。如果42秒过后没有收到消息,请打印一条写着“太晚了”的消息 我为该问题编写的代码如下:Concurrency 二郎市的连通性,concurrency,functional-programming,erlang,Concurrency,Functional Programming,Erlang,我试图解决的问题如下: 编写一个名为print_message的Erlang函数,该函数不带任何参数。函数应等待接收消息。收到消息时(可以是任何Erlang术语),使用io:format()打印消息。如果42秒过后没有收到消息,请打印一条写着“太晚了”的消息 我为该问题编写的代码如下: print_message() -> receive X -> io:format("~p~n",[X]) after 42000 -&g
print_message() ->
receive
X -> io:format("~p~n",[X])
after 42000 ->
io:format("Too late ~n")
end.
在我的问题中,它说“它可以是任何Erlang术语”。在我的代码中使用X是否满足这一要求?或者我是否需要使用以下参考手册中所述的any()的Erlang内置函数:
?您的代码满足要求 Erlang是动态类型的。因此,X的类型将仅在接收到第一条消息时确定,因此它可以是任何Erlang术语 据我所知,我认为不可能在代码中指定X的类型 它在erlang中存在一些类型规范,但用于函数参数、它们的返回值和记录定义
这些类型定义可以在以后的文档中使用,或者由使用。是的,您的代码满足要求。模式
X
匹配任何Erlang术语
与以下内容比较,只有当传入消息是以ok
开头的2元组时,才会匹配:
print_message() ->
receive
{ok, X} ->
或与此匹配,仅当传入消息为整数时匹配:
print_message() ->
receive
X when is_integer(X) ->
或者,只有当传入消息等于函数参数时才匹配:
print_message(X) ->
receive
X ->
(由于变量名称相同,这将变成选择性的receive
,忽略所有其他消息。)
类型规范是Erlang语言的可选部分。您可以指定函数接受整数并返回字符串:
-spec my_function(integer()) -> string().
my_function(N) ->
....
然后你们可以使用透析器来检查类型错误
但是,类型规范仅在编译时使用;它们实际上不会在运行时执行任何检查。此外,它们不能用于指定正在发送或接收的消息的类型;只涉及函数参数和返回值