http://www.example.net/login.php)ただし、各変数が高々1回までしか使われない時に限ります。_には番号がついていないため、複数回使われるとどこに入れたらよいかわからなくなるからです。ここで仕様が変わり、前方一致ではなく正規表現でマッチさせるようにしなければならなくなったとします。この場合でもfilterUrl関数自体に修正を加える必要はなく、引数として与えるパターンや関数値を別のものにすればいいだけです。http://example.net/company.html)この例ではexample.netとその任意のサブドメインにおいて拡張子がhtmlとなっているURLを正規表現で抜き出しています。これなら部長から急に「URLのバリデーションルール変えたいんだけど」って言われてもすぐに対応できますね!このようにリテラルとして書き下したり、変数への代入や引数・戻り値として扱うことができるので、Scalaの関数値は第一級オブジェクトです。ここまで関数値を見てきましたが、ではdefで定義した関数とはどのような関係があるのでしょうか?それを見るために、関数の部分適用という概念について説明します。上で定義したfilterUrlは、パターン文字列もそのマッチの仕方も引数として与えることができるという意味でそれなりに汎用です。前方一致、とか)というケースもあるでしょう。その場合、同じ値を何度も渡さなければならないのは面倒なので、特定のマッチング方式に特化した関数を生み出せると便利です。それができるのが関数の部分適用と呼ばれるテクニックで、次のように使います。List(http://example.net/index.php)つまり、第1引数を_で未適用のまま残しておき、それ以外の引数には具体的な値を与えるのです。その結果得られるものは引数を1つだけ取る関数値になります。function)と呼びます。※1では、defで定義したfilterUrlに引数を0個適用してみましょう。<function3>filterUrlと同じ個数、同じ型の引数を取る関数値が得られました。この章の最初で挙げた、defで定義された関数を別の関数に渡したりできない問題は、このように部分適用(本当は0個なので適用してないけど)によって関数値に変換するというテクニックによって解決できます。次はPHPやJavaなどではあまり聞き慣れないと思われる、カリー化(currying)についてです。Wikipedia[5]によるとカリー化とは『複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること』とありますが、これですぐに「なるほど!」と思える人はあまりいないと思われます。定義されているので、四の五の言わずに試してみましょう。0Atrueつまり、もともと1個のパラメータリスト(パラメータ数は3つ)だったものを3個のパラメータリスト(パラメータ数はそれぞれ1個)にばらした格好になっており、パラメータを1つ与えるたびに残りのパラメータを引数とする関数が現れてきて、最終的に全てのパラメータを与えたときに一つの値が得られる、そんなイメージです。上記の例ではカリー化されていない関数からcurriedメソッドによってカリー化された関数を導きましたが、def形式を用いて最初から以下のように表現することもできます。1Bfalseここでタイムスタンプとフォーマット文字列を与えるとそれに応じた時刻文字列を返す以下の(未カリー化)関数を考えます。00:45:03今、与えられた一つのタイムスタンプに対し、それをいろいろなフォーマットで取得したいという要望があったとします。その場合、次のようなカリー化された関数を用意するとよりスマートに対応できます。2014/03/02_00ただ、このような2引数関数の場合、特にカリー化を経なくても元のformatTimestamp関数に部分適用することによっても似たような特化関数を得ることはできます。00:55:08そもそもカリー化とはパラメータリストを組み換えることであって、引数への値の適用まで意味するものではないため部分適用とは概念として全く異なるものなのですが[6]、「関数をカリー化した後に一部引数に値を適用して得られた残りの関数」と「元の関数に部分適用して得られた残りの関数(をカリー化したもの)」の間に本質的な違いがあるのか、それとも単に導出過程が違うだけで結果的に等価なものが得られているのかについては、筆者の勉強不足により解答が得られていません。Curry)氏に因んだものだそうで、飲み物のカレーとは関係ないそうです、先輩。この方、苗字(⇒カリー化)も名前(⇒純粋関数型プログラミング言語Haskell)も後世に残していてすごいですね。value)とも言われる)になります。呼ばれた関数側で実際にその引数を使うかどうかに関わらず、呼ぶ側で式を評価して値を計算してから関数に渡さなければなりません(これを正格(strict)な評価と言います)。その評価が重いものだった場合、もし使わないのであれば評価せずに済ませたい、仮に使うとしても本当に必要となるときまで計算したくない、と思うかもしれません(対してこちらを非正格(non-strict)な評価と言います)。それを実現する方法の一つとして、関数にラップするという方法があります(関数であれば定義しただけでは実行されないし、Scalaでは引数として関数値を渡すことができる!)。その関数の引数って何?それを見るために0引数関数、つまりFunction0をインスタンス化してみましょう。String」になりました※2。String)Unitのように定義しておけば、たとえmessageが文字列連結まみれであったとしても、debugEnabledがtrueでない限りはその連結が実行されることはありません。"+"message.")のような呼び出し方をしなければならず、なんか嫌です。"+"message.")のように書きつつ、かつ使われるときまで評価を行わないようにできる手段を提供しています。String」とすることです。String)Unit「空」引数関数を「無」引数関数にすることによって関数としての性質も残しつつ、呼び出し()なしで使えるようにしている感じですね。この「(呼び出し時点ではなく)実際に使用されたときに値を評価する」ような渡し方ですが、複数回使われたときの動作の違いによって2つに分類されます。need)と言います[7]。型」を用いるやり方は名前渡しになるので、この機能は名前渡し引数とか名前渡しパラメータと呼ばれます。valに格納してから名前渡し引数として渡すといったことをする必要があります。呼び出すその場で評価をしないということから非正格評価全体を指して「遅延評価」と呼んでいるものもあるようですが、名前渡しのように何度も式の評価が走ってしまうものは遅延評価と呼ぶべきではないといった見解もあるようで[8,9]、ここでは明言は避けておきます。functions)というものもありますが全くの別物です。これはまた別の機会に。String」になるはず)。なんだろうこれ...。Dashboarding)を使ってみ...はじめましてこんにちは、新米データサイエンティストのh_matsu...2017-02-09CTR予測とAdaGradこんにちはデータサイエンティストのt_sakaiです。Sparkを使って、メモリ使用量が大きいバッチ処理をスケールアウト初めまして、弊社で1ヶ月半ほどインターンとして働いているt_s...2014-10-14PHPのジェネレータを使おうこんにちは。最近、都内を離れると行くとこ...2014-06-20DboSource::getLog()で発行されたSQLを確認するh_nagayamaです。Are青山のアドテク会社。アドネットワークやDSPを開発・運用。サーバを止めてみたよ。インターン:実業務体験編インターンでCTR予測をしましたSearchArchiveスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。