次回ハンズオン勉強会の告知です。
-----
第4回 JavaエンジニアのためのScalaハンズオン勉強会
[日時]
2011年6月30日(木) 19:00~20:00
[場所]
エムスリー株式会社 12F来客用会議室1
http://corporate.m3.com/corporate/overview/map.html
[題材]
非純粋関数型言語としてのScala
「カリー化、部分適用、名前渡し」
-----
例のごとく、以下のブログ記事をネタに進めます。
http://d.hatena.ne.jp/seratch2/20110428/1304013135
今日、フライング気味にクロージャまで確認しましたが
次回はその続きをやりたいと思います。
よろしくお願いします。
昨日はお疲れさまでした。初参加、楽しかったです。
カリー化についてですが、自宅に帰ってHaskell本を引っ張りだし(3冊あった・・・)て
ヒントが無いか調べてみました。
まず、Haskellでカリー化がでてくるいきさつはこんな感じみたいです。
(1) Haskellでは関数定義で引数は1つしか定義できない。※タプルなら複数引数ぽくできる。
↓
(2) じゃあ、カリー化(関数を返すことで全ての関数を1つの引数の関数として表現)することにすると大丈
夫。複数の引数が渡せる。
↓
(3) 関数で部分適用すると便利なことが多いね。部分適用するということは引数が複数ということなので、言い
換えると「カリー化を部分適用すると便利なことが多いね。」になる。
ただ、「引数が1つ」が先か「カリー化」が先かというところはよくわかりません。もしかしたら、カリー化と
いう概念がそもそもあって、それがあるから引数は1つにしたのかもしれません。
次に、Wikiぺ(http://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AA%E3%83%BC%E5%8C%96)に
以下のような記述がありました。
「カリー化を基盤としているプログラミング言語もある。特にMLとHaskellでは関数は常に一つの引数のみを取
り、複数の引数を取る関数とは、単にネストされた複数の一引数関数の糖衣構文にすぎない。第一級関数を扱え
る言語、たとえばLISP、Scheme、Scala、Erlang、Eiffel、Perl、Ruby、Python、R言語、S言語、JavaScript、
Groovyなどでは、カリー化関数を作ることができる。」
Scalaとかだと「作ることができる」と、選択肢のひとつになってます。確かに。
結局は、Haskellで便利なことを取り入れているのだと思いますが、Scalaの場合はカリー化しなくても複数引数
渡せて、かつ、部分適用すると関数が帰ってくる。
このために、カリー化と同じことができてしまっていることから、違いは?みたいなことになっているのではな
いでしょうか。
オライリー「プログラミングScala」の8.9 カリー化にありますが、「カリー化の主要な用途は関数を特定の種
類のデータ用に特化すること」で、つまり、部分適用して返ってきた関数を使うことに利点があるのだと思いま
す。で、その部分適用して関数を返すという事に関して、カリー化しておいたほうがスッキリ書けるとか、そん
な感じなのかなーと考えています。
みなさん、いかがでしょう?
--
Naoki Tanimura
★★
∠
瀬良(@seratch)です。
ありがとうございます。
懇親会でもHaskellの経緯は
同じような感じで話に出ていました。
オライリー本(p.200)で出てくるサンプルって
部分適用のメリットを説明しているんですが
def multiplier(i:Int)(factor:Int) = i * factor
val byFive = multiplier(5) _
val byTen = multiplier(10) _
もしカリー化が使えなかったら
こう書かないといけないですね。
def multiplier(i:Int,factor:Int) = i * factor
val byFive = multiplier(5,_:Int)
これはカリー化による実用上の恩恵といえそうですね。
scalatraのcontrollerは
カリー化をうまく使った好例です。
https://github.com/scalatra/scalatra
get("/") {
<h1>Hello, world!</h1>
}
もしカリー化がなかったら
こう書かないといけなくなっちゃいます。
get("/",{
<h1>Hello, world!</h1>
})
2011/7/1 谷村直樹 <naoki.t...@gmail.com>: