erlang是一種動態型別的語言(執行時才決定資料型別),可以自己宣告一些資料型別
(1) 預定義型別
首先erlang自己有一套預定義的資料型別, 也可以有使用者自己定義的型別,自己定義的型別都**於這些預定義的型別的組合及型別定義的語法,
預定義型別:
type :: any() %% the top type, the set of all erlang terms.
| none() %% the bottom type, contains no terms.
| pid()
| port()
| reference()
| %% nil
| atom
| binary
| float()
| fun
| integer
| list
| tuple
| union
| userdefined %% described in section 2
union :: type1 | type2
atom :: atom()
| erlang_atom %% 'foo', 'bar', ...
binary :: binary() %% <<_:_ * 8>>
| <<>>
| <<_:erlang_integer>> %% base size
| <<_:_*erlang_integer>> %% unit size
| <<_:erlang_integer, _:_*erlang_integer>>
fun :: fun() %% any function
| fun((...) -> type) %% any arity, returning type
| fun(() -> type)
| fun((tlist) -> type)
integer :: integer()
| erlang_integer %% ..., -1, 0, 1, ... 42 ...
| erlang_integer..erlang_integer %% specifies an integer range
list :: list(type) %% proper list (-terminated)
| improper_list(type1, type2) %% type1=contents, type2=termination
| maybe_improper_list(type1, type2) %% type1 and type2 as above
tuple :: tuple() %% stands for a tuple of any size
| {}
| tlist :: type
| type, tlist
(2) 內建的一些型別:
一些聯合型別的,是erlang系統已經定義好的,可以認為是自定義的, 當然erlang已經有的型別名字,我們自己不可以再次使用,編譯時候會對這些型別進行檢查:
built-in type stands for
term() any()
boolean() 'false' | 'true'
byte() 0..255
char() 0..16#10ffff
non_neg_integer() 0..
pos_integer() 1..
neg_integer() ..-1
number() integer() | float()
list() [any()]
maybe_improper_list() maybe_improper_list(any(), any())
maybe_improper_list(t) maybe_improper_list(t, any())
string() [char()]
nonempty_string() [char(),...]
iolist() maybe_improper_list(char() | binary() | iolist(), binary() | )
module() atom()
mfa()
node() atom()
timeout() 'infinity' | non_neg_integer()
no_return() none()
(3)使用者自定義型別:
自己定義的類,必須引用已經有的預定義型別,或者已經定義過的型別,或者其他模組匯出的型別,自定義型別的模板:-type my_struct_type() :: type.
例如自己定乙個int型,
-type int() :: integer().
這裡integer() 必須是已經有的型別
(4)應用:
程式中的函式說明的通常用法,用這種方法更通用,結構固定,容易理解,
格式如下: -spec module:function(argtype1, ..., argtypen) -> returntype.
例如自己定義乙個int(), 並且給test/1函式進行說明:
-module(test).
-compile(export_all).
-type int() :: integer().
<1> -spec test:test(integer()) -> integer().
<2> -spec test:test(a) -> a when
a::integer().
<3> -spec test:test(int()) -> int().
test(a) when is_integer(a) ->
a. 這三種方法都可以,方法<3>用了自己定義的型別int().
erlang中的spawn函式
spawn fun pid 引數型別 fun function 引數為空的函式 返回型別 程序pid 說明 生成乙個由fun函式啟動的 引數為空的新程序,並返回程序的pid。spawn node,fun pid 引數型別 node node 節點 fun function 引數為空的函式 返回型別 ...
erlang中的型別表示( spec, type)
看 erlang程式設計 第一次接觸第九章型別幾乎什麼都沒看懂,簡單就掠過去了,後來回鍋炒以及看了一些內建模組的原始碼,來有所悟。下面就是我對型別表示的一些理解。補充強調 spec和 type型別表示法,僅僅是一種說明性語法,對實際引數或返回值型別並不做限制,也就是說,它告訴 你這裡引數只有這樣填入...
Erlang中的fun函式使用詳解
先看乙個erlang的規定 在eralng中,同乙個模組中的兩個函式,如果她們同名但是它們的目 arity 不同,這樣的兩個函式被認為是完全不同的兩個函式。通常情況下,這樣的函式被用作輔助函式。fun函式就是乙個匿名函式 因為他自己沒有名字 但就這個匿名函式,用處卻是很大的。fun既可以作為函式的引...