scala是一種函式式程式語言,也就是說每乙個函式都是乙個值。scala有很簡潔的語法用於定義匿名和curry化函式(curried function,functional programming的概念之一,名字源於haskell curry,haskell的發明者,一般都不翻譯。本文後面並沒有針對這個概念的解釋和實現,有興趣者請參閱相關參考資料——譯註),以及巢狀函式等。
為了演示如何將函式作為乙個值使用,我們定義乙個exists函式,用於檢測乙個陣列當中是否有符合條件的元素:
defexists[t
](xs
: array[t
], p: t
=>
boolean
) =
方法引數[t]表示陣列型別是任意的(型別引數在5.1節中詳細介紹),引數p表示驗證條件也是任意的,p的型別是函式型別(function type)t=>boolean,表示所有定義域是t型別,值域是boolean的函式。函式引數可以像普通函式一樣執行,如上面的迴圈體中顯示的p被呼叫那樣。以函式作為引數或者返回值的函式,稱為高階函式。
定義了exists,我們可以通過雙重否定來定義乙個函式forall,表示陣列的所有元素沒有乙個不符合條件的,該函式定義如下:
defforall[t
](xs
: array[t
], p: t
=>
boolean
) =
函式forall內部定義了乙個巢狀函式not_p,表示不滿足條件p。巢狀函式可以訪問所在環境的函式引數和本地變數,例如not_p訪問了forall的引數p。
scala還可以定義乙個沒有名字的函式,例如下面這個簡版的forall函式:
defforall_short[t
](xs
: array[t
], p: t
=>
boolean
) =
!exists(xs, (x: t) => !p(x))
其中(x: t) => !p(x)定義了乙個匿名函式(anonymous function),將型別為t的引數p對映為!p(x)。
有了exists和forall,我們可以定義乙個函式haszerorow,用以檢驗乙個二維矩陣是否有一行全是0:
defhaszerorow
(matrix
: array[array[int]]) =
exists(matrix, (row: array[int]) => forall(row, 0 ==))
表示式forall(row, 0 ==)用於檢測row是否只包含0。這裡,0的==方法被作為引數傳遞給forall的引數p,這顯示了方法本身也是值,有點類似於c#中的「delegates」。
物件導向 (1)概述
先介紹幾個重要的概念 1 物件導向 object oriented 2 物件 object 是物件導向開發模式的基本成分。每個物件可用它本身的一組屬性和它可以執行的一組操作來定義。3 訊息 message 乙個物件與另乙個物件的通訊單元,是要求某個物件執行類中定義的某個操作的規格說明 物件向物件發出...
scala基礎題 物件導向1
練習1 編寫computer類,包含cpu 記憶體 硬碟等屬性,getdetails方法用於返回computer的詳細資訊。編寫pc子類,繼承computer類,新增特有屬性 品牌brand 編寫notepad類,繼承computer類,新增特有屬性 顏色color 編寫test object,在m...
作業系統概述(1)
1 作業系統的概念 作業系統 operating system,簡稱os 是管理和控制計算機硬體與軟體資源的電腦程式,是直接執行在 裸機 上的最基本的系統軟體,任何其他軟體都必須在作業系統的支援下才能執行。作業系統是使用者和計算機的介面,同時也是計算機硬體和其他軟體的介面。作業系統的功能包括管理計算...