erlang中的型別表示( spec, type)

2021-10-05 15:31:43 字數 2925 閱讀 2976

看《erlang程式設計》,第一次接觸第九章型別幾乎什麼都沒看懂,簡單就掠過去了,後來回鍋炒以及看了一些內建模組的原始碼,來有所悟。下面就是我對型別表示的一些理解。

補充強調:-spec和-type型別表示法,僅僅是一種說明性語法,對實際引數或返回值型別並不做限制,也就是說,它告訴:你這裡引數只有這樣填入我才能保證你會有這樣的輸出,否則如果你不按要求來,我雖然接受,但後果自負!!!。

直接上**(《erlang程式設計》原書**片段):

-module(walks).

-export(

[plan_route/2]

).-spec plan_route(point(

),point(

)) -> route(

). % 型別規範

-type direction(

) :: north(

)| south(

)| east(

)| west. % 型別定義

-type point(

) :: . % 型別定義

-type route(

) :: [

]. % 型別定義

plan_route(_a,_b)->

% **省略。

...

-spec表示這是對乙個函式進行規範,人話就是:說明函式的引數或者返回值的型別。因為erlang的函式定義沒有引數型別和返回值型別說明,所以利用-spec 來單獨定義。

並且-spec plan_route(point(),point()) -> route().這一行僅僅是對函式的規範,沒有函式體,所以你還要在再編寫乙個具體實現的函式。

定義-spec具體可以使用的型別。通過上面的**應該能發現,-spec規範總使用的全是利用-type定義的型別。它有具體的格式:

t1 :: a | b | c ...
也就是t1 代表等下回引用的名稱,它可以是a,b,c等中的乙個。

並且a,b,c可以是其他-type定義的型別,就像上面**一樣。

除此之外還有一些erlang早就定義好的基本型別,我就將表放在了最後。

-spec plan_route(point(),point()) -> route().

這行**雖然規範了plan_route函式的引數,返回值型別,但是你能卻根本沒有一點具體含義的提示,你知道這個函式是幹嘛的嗎?

當然不知道。

所以有了對型別的註解。

寫法:-spec plan_route( name1 :: point(), name2 :: point()) -> route().

利用name1,和name2來提示型別的資訊。

對於-spec的寫法,完全體其實是這樣的:

-spec functionname(t1,t2,t3...tn) -> tret when

ti :: typei,

tj :: typej,

...

意思就是,現在我們將所有型別的註解全部寫在when關鍵後面,並取乙個靚麗的名稱,然後引數和返回值型別只要引用這個靚麗的名字就可以了。

改進一下之前的**如下:

-module(walks).

-export(

[plan_route/2]

).%% 注意看這裡 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

-spec plan_route(name1,name1) -> name2 when

name1 :: point(

), name2 :: route().

-type direction(

) :: north(

)| south(

)| east(

)| west.

-type point(

) :: .

-type route(

) :: [

].plan_route(_a,_b)->

% **省略。

...

erlang的預定義型別:型別

-type term() :: any()

-type boolean() :: true | false

-type byte() :: 0 … 255

-type char() :: 0 …16#10ffff

-type number() :: integer() | float()

-type list() :: [any()]

-type maybe_improper_list() :: maybe_improper_list(any(),any())

-type maybe_improper_list(t) :: maybe_improper_list(t,any())

-type string() :: [char()]

-type nonempty_string() :: [char(),…]

-type iolist() :: maybe_improper_list(byte() | binary() |iolist() | binary() | )

-type module() :: atom()

-type mfa() ::

-type node() :: atom()

-type timeout() :: infinity | non_neg_integer()

-type no_return() :: none()

Erlang中的程序表示

test1 pid spawn fun receive stop void end end pid stop.test2 register tut,spawn fun receive stop void end end tut stop.pid 的生成 pid表示為,可以通過list to pid ...

erlang的強資料型別

在mailist中,一位朋友表示疑問,為什麼下面的語句提示出錯?erlang的執行時資料繫結有什麼特殊規則?file open test.file write,raw,提示badarg,引數錯誤。其實不是執行時繫結有什麼問題,而是math pow 2返回的資料型別為float,而file open ...

erlang的資料型別 (2)

繼續前面說列表。列表裡面的元素,第乙個成為head,head之後的都叫tail。用erlang的內建方法看一下 hd 1,2,3,4 1 tl 1,2,3,4 2,3,4 為什麼要這樣呢?因為列表的指標是在頭部的,對頭部進行操作是最快捷和高效的。使用豎線 能快速區分頭部和尾部 h t 1,2,3,4...