[英]Conncurency in Erlang
我試圖解決的問題如下:
編寫一個名為 print_message 的 Erlang function 不接受 arguments。 function 應該等待接收消息。 收到消息后(可以是任何 Erlang 術語),使用 io: format() 打印消息。 如果 42 秒后沒有收到消息,則打印一條消息“太晚了。”。
我為這個問題編寫的代碼如下:
print_message() ->
receive
X -> io:format("~p~n",[X])
after 42000 ->
io:format("Too late ~n")
end.
在我的問題中,它說“它可以是任何 Erlang 術語”。 在我的代碼中使用 X 是否滿足該要求? Or do I need to use the Erlang built in function of any() as stated in the below reference manual: https://erlang.org/doc/reference_manual/typespec.html ?
是的,您的代碼符合要求。 模式X
匹配任何 Erlang 術語。
與以下比較,僅當傳入消息是一個以ok
開頭的 2 元組時才匹配:
print_message() ->
receive
{ok, X} ->
或者,僅當傳入消息是 integer 時才匹配:
print_message() ->
receive
X when is_integer(X) ->
或者,僅當傳入消息等於 function 參數時才匹配:
print_message(X) ->
receive
X ->
(由於變量名稱相同,這變成了選擇性receive
,所有其他消息都被忽略。)
類型規范是 Erlang 語言的可選部分。 您可以指定您的 function 采用 integer 並返回一個字符串:
-spec my_function(integer()) -> string().
my_function(N) ->
....
然后您可以使用 Dialyzer 檢查類型錯誤。
但是,類型規范僅在編譯時使用; 他們實際上並沒有在運行時執行任何檢查。 此外,它們不能用於指定發送或接收消息的類型; 僅涵蓋 function arguments 和返回值。
您的代碼滿足要求。
Erlang 是動態類型的。 因此 X 的類型將僅在接收到第一條消息時確定,因此它可以是任何 Erlang 項。
據我所知,我認為不可能在代碼中指定 X 的類型。
它在 erlang 中存在一些類型規范,但它用於 function 參數、它們的返回值和記錄定義。
這些類型定義可以稍后用於文檔或透析器
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.