簡體   English   中英

Erlang 中的並發

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM