看《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...