contentRainbowDevilsLandけんじの外部記憶です。kenji高階関数のお話です。高階関数はSICPでやったのでさらっと流します。file}“ファイル名が指定した文字列で終わっている”ファイルの一覧の他に、”文字列を含んでいる”や、”正規表現がマッチする”も追加したいとします。そのたびにfor文を含めたメソッドをコピーするのはよろしくありません。するかというと、条件に一致するかどうか判断する関数をパラメータとすることで統一することができます。file}共通化ができたので、それを使うそれぞれの関数は次のようになります。.matches()).endsWith()は一見謎なコードですが、次のコードをプレースホルダーを使って簡潔に書いたものです。fileName.endsWith(query)二つのパラメータfileNameとqueryは、それぞれ1回しか使わないので、プレースホルダーにする事ができます。すると次のコードに短縮できるわけです。.endsWith()クロージャーを使うことでさらに短く書けます。.endsWith())のqueryと、二つ目のアンダースコアは同じものを指しており、二つ目のアンダースコアはqueryと書けます。するとqueryをパラメータとして指定する必要がなくなるので、次のようになります。filesMathing(_.endsWith(query))プレースホルダー構文による関数リテラルと、クロージャーによる自由変数の束縛でここまで短くできるわけですね。この例では、API実装側が重複コードを削減すると言う観点から高階関数を使いました。次はクライアント側の観点で高階関数を使うメリットを紹介します。Int型を含むリストの中に、負数が含まれているかをチェックするcontainsNegと言う関数を考えます。exists}このコードを、値が存在するかチェックする関数をパラメータとして取るexistsメソッドを使うことで簡潔にします。0)Scala標準ライブラリには、このような高階関数でループ処理を簡潔に書くことができるメソッドが多数あります。カリー化カリー化とは、二つ以上のパラメータを取る関数を、一つのパラメータを取る関数に変換する事です。3イメージ的には、curriedSumは、パラメータを一つ取り、”パラメータを一つ取る関数”を返して、それに二つ目の引数を作用させていると言う感じです。次のようにすれば、部分適用された途中の関数を取り出すことができます。3カリー化は一見意味が無いように見えますが、関数型言語では重要な要素です。関数型のプログラミング技術についてはScala関数型デザイン&プログラミングを読むとよりよいかと思います。method)を持つ言語では、引数として関数を取るメソッドを使うことで新しい制御構造を作ることができます。次は、ファイルと”どう書くか”の関数をパラメータとして受け取り、ファイルをオープンして書き込んでクローズする関数です。pattern)と呼ばれているパターンです。java.util.Date)}Scalaは、「引数を一個だけ渡すメソッド呼び出しは、引数を囲む括弧を中括弧に変えて良い」と言う仕様があります。そこで、先ほどのカリー化と組み合わせると、上記のコードは次のように書くことができます。java.util.Date)}まるで言語に組み込まれた制御構造のようです!名前渡しパラメータ名前渡しパラメータは、遅延評価される形で式を関数に渡すことができます。次のアサーションを行うメソッドを考えます。AssertionError//これは次のように使えます。3)名前渡しパラメータを使うと、関数に作用させるときに評価するのでは無く、式を実際に使うまで評価を遅延させることができます。Booleanと()を記述しないことで指定できます。Replyコメントを投稿するには、下の計算の答えを入力する必要があります。答えは半角数字で入力してください。