Erlang 原子類型

2022-07-07 15:33 更新

原子類型

原子類型是 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 表示華氏度。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)