1. 程式人生 > >Erlang中的fun函式使用詳解

Erlang中的fun函式使用詳解

   先看一個Erlang的規定:在Eralng中,同一個模組中的兩個函式,如果她們同名但是它們的目(arity)不同,這樣的兩個函式被認為是完全不同的兩個函式。通常情況下,這樣的函式被用作輔助函式。
   fun函式就是一個匿名函式(因為他自己沒有名字),但就這個匿名函式,用處卻是很大的。fun既可以作為函式的引數,也可以作為函式(或者自己本身fun)的返回結果。
   現在,我們再來看一下fun函式的簡單使用:

4> Triple = fun(X) -> 3*X end.
#Fun<erl_eval.6.13229925>
5> Triple(3).


9
6>

當我們定一個fun的時候,會出現#Fun<erl_eval...>之類的東西,我自己也不清楚,不過先不要管這個。我們繼續往下看。

Triple = fun(X) -> 3*X end.
是定義一個fun,只有一個引數量,也就是隻有一個目,在fun結束的時候,需要將end加在後面的。當我們要呼叫它的時候,直接使用Triple,然後加上引數就行了。

注:本部落格的例子可能許多都是來自Joe Armstrong的《Erlang程式設計》一書,或者在原來基礎上稍加改變。
   我們再來詳細的學習這個fun:
1.用fun作為函式的引數
上面的例子是隻有一個引數,相信大家都能看懂。現在看一下使用多個引數時的情景。

1> Hypot = fun(X, Y) -> math:sqrt(X*X + Y*Y) end.
#Fun<erl_eval.12.113037538>
2> Hypot(3, 4).
5.0
3>

很容易看懂吧,其中的math是一個模組,sqrt是其中的一個函式,是用來計算平方根的。
fun也可以有若干個不同的子句。
比如下面的星期轉換:

3> Week = fun({monday}) -> {1};
3> ({tuesday}) -> {2}
3> end.
#Fun<erl_eval.6.13229925>


5> Week({monday}).
{1}
6>

2.以fun作為引數的函式
lists是標準庫中的一個模組,從中匯出的很多函式都是以fun作為引數的函式,比如,map,filter等。下面是一個測試:

1> L = [1, 2, 3, 4].
[1,2,3,4]
2> Double = fun(X) -> 2*X end.
#Fun<erl_eval.6.13229925>
3> lists:map(Double, L).
[2,4,6,8]
4> Even = fun(X) -> (X rem 2) =:= 0 end.
#Fun<erl_eval.6.13229925>
5> lists:filter(Even,L).
[2,4]
6> Even(8).
true
7> Even(7).
false
8> L.
[1,2,3,4]
9>

在這個例子當中,map的第一個引數即為fun。
3.
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script> 閱讀(4469) | 評論(0) | 轉發(0) | 給主人留下些什麼吧!~~ 評論熱議