20 erlang中的型別和函式說明

2021-09-01 19:41:57 字數 2875 閱讀 2604

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既可以作為函式的引...