良いプログラマは高階関数を学習大きなデータラインを共有するために、我々は通常、呼び出された関数にパラメータを渡すための表現方法として使用することができます
注文機能は、前記関数値、匿名関数、クロージャを、などをカリー化。
フォーマット定義関数:ヴァル=変数名(入力パラメータの種類と数)=>関数実装と戻り値の数と種類
「=」変数に割り当てられている機能を示します
「=>」左入力パラメータ名、タイプ、および数を示し、右側を達成するためにパラメータや関数の戻り型の数を表します。
の値の関数として、
定義関数
スカラ>ヴァルFUNC =(X:INT)=> X * X
FUNCます。int =>のInt = <関数1>
スカラ>ヴァルFUNC:のInt =>のInt = X => X * xの
FUNC:のInt =>のInt = <関数1>
スカラ> FUNC(3)
RES0ます。int = 9
関数呼出し
スカラ>ヴァルARR =アレイ(1,2,3,4)
ARR:配列[INT] =配列(1、2、3、4)
スカラ>ヴァルRES = arr.map(X => FUNC(X))
RES:配列[INT] =配列(1、4、9、16)
スカラ>ヴァルRES = arr.map(FUNC(_))
RES:配列[INT] =配列(1、4、9、16)
スカラ>ヴァルRES = arr.map(FUNC)
RES:配列[INT] =配列(1、4、9、16)
の関数としての変換方法
スカラ> DEF M1(X:INT):= x *はXのInt
M1:(X:INT)のInt
スカラ> DEF M1(X:INT)= X * X
M1:(X:INT)のInt
スカラ> DEF M2(X:INT){X * X}
M2:(X:INT)ユニット
スカラ>ヴァルF1 = M1 _
F1:のInt =>のInt = <関数1>
スカラ>ヴァルRES = arr.map(X => M1(X))
RES:配列[INT] =配列(1、4、9、16)
スカラ>ヴァルRES = arr.map(M1(_))
RES:配列[INT] =配列(1、4、9、16)
スカラ>ヴァルRES = arr.map(M1)
RES:配列[INT] =配列(1、4、9、16)
無名関数
スカラ座では、あなたはそれぞれの関数に名前を付ける必要はありません、何も機能は無名関数と呼ばれる変数に割り当てられている機能ではありません
スカラ> arr.map((X:INT)=> X * X)
RES3:配列[INT] =配列(1、4、9、16)
スカラ> arr.map(X => X * X)
RES4:配列[INT] =配列(1、4、9、16)
スカラ> arr.map(M1)
RES1:配列[INT] =配列(1、4、9、16)
スカラ> arr.map(_ * 2)
RES2:配列[INT] =配列(2、4、6、8)
クロージャ
閉鎖は、他の機能で読み取ることができる内部変数の関数であり、
それは関数内で定義された関数に、理解されるように
本質的に、クロージャは、ブリッジをリンクする内部および外部関数の関数であります
オブジェクト{Bibao
DEF和(F:のInt => INT):( INT、INT)=>のInt = {
INT、B:INT):のInt = {DEF(SUMF
場合(A> B)0他F(A)+ SUMFを(A + 1、B)
}
SUMF //隐式转换成函数
}
DEFメイン(引数:配列[文字列]):単位= {
DEF sumInts = SUM(X => X)
のprintln(sumInts(1,2))
}
}
カリー化
カリー化は、パラメータ・リストの新しい方法または機能をメソッドまたは関数の引数リストの手順となる受信元の2つのことをいいます
宣言と変換
(Y:INT)= X * Y //声明:スカラ> DEF(中間体X)カレー
カレー:(X:INT)(Y:INT)のIntを
スカラ>カレー(3)(4)
res8ます。int = 12
スカラ>カレーヴァルのcurry1 =(3) //変換方法: "追加 "
curry1ます。int =>のInt = <関数1>
スカラ> curry1(5)
res9ます。int = 15
スカラ> DEF curry2(X:INT)=(Y:INT)=> X * Y //声明
curry2:(X:INT)のInt =>のInt
スカラ>ヴァルFUNC = curry2(2 )// 直接変換
FUNCます。int =>のInt = <関数1>
スカラ> FUNC(4)
res16ます。int = 8
スカラ> DEF curry3()=(X:INT)=> X * X
curry3:()のInt =>のInt
スカラ>ヴァルFUNC = curry3() // ヌル変換パラメータ
FUNCます。int =>のInt = <関数1>
スカラ> FUNC(3)
res17ます。int = 9
望ましく組み合わさ暗黙的な変換をカリー化
暗黙暗黙 - >同じタイプの現在のセッションで暗黙値が異なる複数種類のことができ、一度だけ定義することができます。
スカラ> DEF M1(X:INT)(暗黙Y:のInt = 5)= Xの* yを
M1:(X:INT)(暗黙Y:INT)のInt
スカラ> M1(3)
res10ます。int = 15
スカラ> M1(3)〜(6 )// 暗黙の値を変更してもよい
res11ます。int = 18
スカラ>暗黙のVal、X = 100 //定義された暗黙のグローバル値、覆われていてもよい
のInt = 100:X
スカラ> M1(3)〜(6)
res12ます。int = 18
スカラ> M1(3)
res13ます。int = 300
スカラ>暗黙のヴァル・Y = "ABC"
Y:文字列= ABC
ケース:追加値のゴースト前駆配列
スカラ>ヴァルARR =配列(( "西渓"、1)、( "母"、2)、( "heihei"、3))
ARR:配列[(文字列、INT)] =配列((西渓、1)、 (母、2)、(heihei、3))
スカラ> arr.foldLeft(0)(+ ._2)//(初期値)(前回の計算サイクルの結果+)
res15:のInt 6 =
Curry的Demo
オブジェクトコンテキスト{//一般的に呼び出して、ここで再び、新しいカテゴリになります
暗黙ヴァルA =「Yaoyaoの」
暗黙のB =ヴァル100
}
のオブジェクト{カレー
//変数が、システムは問題ではない、それ自体は、同じタイプの値と一致する
暗黙ヴァルA =「Yaoyaoの」
ヴァル100 =暗黙B
デフM1(STR:String)を(暗黙名:文字列= "xiaodan"){
のprintln(STR +名)
}
DEFメイン(引数:配列[文字列]):単位= {
インポートContext.a
M1( "こんにちは")
}
}
暗黙的な変換
処置:強化クラスへの暗黙的なアプローチ、既存のライブラリ関数を豊かに
暗黙的な変換:
継承 - >親クラスのメソッドを強化するための方法を書き換えることにより、
プロキシモード - >サイト、プロキシインスタンスのために使用されるリモートエージェントは、メソッドを呼び出す前に、インスタンスメソッドのために向上させることができます
エージェント、周囲の後方法
デコレーションモード - ファイルを読み込むためにJavaを使用して、だけでなく、インスタンスメソッドを強化する際に>装飾的なパターン、また梱包モードとして知られ、IOを使用するためのストリーム
新しいBufferInputStream(新規のFileInputStream).read()
これは、装飾的なパターンやファサードのモードで使用されています - >
装飾的なパターンは、パッケージに表示され、暗黙的な変換は、包装暗黙的に行われています
Facadeパターンは、暗黙的なパッケージとして機能します
暗黙の伝達関数:キーワードのステートメントは、単一で暗黙の引数の関数を参照します
ケース:暗黙的な変換は、readメソッドから直接呼び出すことができますURI与えられた文書の内容を読み取ります
オブジェクトMyPredef {
// fileToRichFile(ファイル:文字列)DEF暗黙の=新しいRichFile(ファイル)
暗黙のヴァルfileToRichFile =(ファイル:文字列)=>新しいRichFile(ファイル)
}
オブジェクトRichFile {
DEFメイン(引数:配列[文字列]):単位= {
ヴァル・ファイル= "E://wordcount.txt"
// //ファイルの向上を達成するための方法を示します
// valをrichFile =新しいRichFile(ファイル)
// valの内容:文字列= richFile.read()
//のprintln(コンテンツ)
//暗黙的な変換
輸入MyPredef.fileToRichFile
コンテンツ= file.readヴァル()
println(コンテンツ)
}
}
クラスRichFile(ヴァルファイル:文字列){
// readメソッドを作成します。
DEF)(読み:文字列= {
Source.fromFile(ファイル).mkString
}
}