原子類型是 Erlang 語言中另一種數(shù)據(jù)類型。所有原子類型都以小寫字母開頭 (參見 原子類型)。例如,charles,centimeter,inch 等。原子類型就是名字而已,沒有其它含義。它們與變量不同,變量擁有值,而原子類型沒有。
將下面的這段程序輸入到文件 tut2.erl 中。這段程序完成英寸與厘米之間的相互轉(zhuǎn)換:
-module(tut2).
-export([convert/2]).
convert(M, inch) ->
M / 2.54;
convert(N, centimeter) ->
N * 2.54.
編譯:
9> c(tut2).
{ok,tut2}
測試:
10> tut2:convert(3, inch).
1.1811023622047243
11> tut2:convert(7, centimeter).
17.78
注意,到目前為止我們都沒有介紹小數(shù)(符點(diǎn)數(shù))的相關(guān)內(nèi)容。希望你暫時(shí)先了解一下。
讓我們看一下,如果輸入的參數(shù)既不是 centimeter 也不是 inch 時(shí)會(huì)發(fā)生什么情況:
12> tut2:convert(3, miles).
** exception error: no function clause matching tut2:convert(3,miles) (tut2.erl, line 4)
convert 函數(shù)的兩部分被稱之為函數(shù)的兩個(gè)子句。正如你所看到的那樣,miles 并不是子句的一部分。Erlang 系統(tǒng)找不到匹配的子句,所以返回了錯(cuò)誤消息 function_clause。shell 負(fù)責(zé)被錯(cuò)誤信息友好地輸出,同時(shí)錯(cuò)誤元組會(huì)被存儲(chǔ)到 shell 的歷史列表中,可以使用 v/1 命令將該列表輸出:
13> v(12).
{'EXIT',{function_clause,[{tut2,convert,
[3,miles],
[{file,"tut2.erl"},{line,4}]},
{erl_eval,do_apply,5,[{file,"erl_eval.erl"},{line,482}]},
{shell,exprs,7,[{file,"shell.erl"},{line,666}]},
{shell,eval_exprs,7,[{file,"shell.erl"},{line,621}]},
{shell,eval_loop,3,[{file,"shell.erl"},{line,606}]}]}}
前面的 tut2 的程序的風(fēng)格不是一好的編程風(fēng)格。例如:
tut2.convert(3,inch)
這是意味著 3 本身已經(jīng)是英寸表示了呢?還是指將 3 厘米轉(zhuǎn)換成英寸呢? Erlang 提供了將某些元素分成組并用以更易于理解的方式表示的機(jī)制。它就是元組。一個(gè)元組由花括號(hào)括起來的。
所以,{inch,3} 指的就是 3 英寸,而 {centimeter, 5} 指的就是 5 厘米。接下來,我們將重寫厘米與英寸之間的轉(zhuǎn)換程序。將下面的代碼輸入到文件 tut3.erl 文件中:
-module(tut3).
-export([convert_length/1]).
convert_length({centimeter, X}) ->
{inch, X / 2.54};
convert_length({inch, Y}) ->
{centimeter, Y * 2.54}.
編譯并測試:
14> c(tut3).
{ok,tut3}
15> tut3:convert_length({inch, 5}).
{centimeter,12.7}
16> tut3:convert_length(tut3:convert_length({inch, 5})).
{inch,5.0}
請注意,第 16 行代碼將 5 英寸轉(zhuǎn)換成厘米后,再轉(zhuǎn)換為就英寸,所以它得到原來的值。這也表明,一個(gè)函數(shù)實(shí)參可以是另一個(gè)函數(shù)的返回結(jié)果。仔細(xì)看一下,第 16 行的代碼是怎么工作的。將參數(shù) {inch,5} 傳遞給函數(shù)后,convert_length
函數(shù)的首語句的頭首先被匹配,也就是 convert_length({inch,5})
被匹配。也可以看作,{centimeter, X} 沒有與 {inch,5} 匹配成功 ("->" 前面的內(nèi)容即被稱之為頭部)。第一個(gè)匹配失敗后,程序會(huì)嘗試第二個(gè)語句,即 convert_length({inch,5})
。 第二個(gè)語句匹配成功,所以 Y 值也就為 5。
元組中可以有更多的元素,而不僅僅像上面描述的那樣只有兩部分。事實(shí)上,你可以在元組中,使用任意多的部分,只要每個(gè)部分都是合法的 Erlang 的項(xiàng)。例如,表示世界上不同城市的溫度值:
{moscow, {c, -10}}
{cape_town, {f, 70}}
{paris, {f, 28}}
這些元組中每個(gè)都有固定數(shù)目的項(xiàng)。元組中的每個(gè)項(xiàng)都被稱之為一個(gè)元素。在元組 {moscow,{c,-10}} 中,第一個(gè)元素為 moscow 而第二個(gè)元素為 {c,-10}。其中,c 表示攝氏度,f 表示華氏度。
更多建議: