第4回 JavaエンジニアのためのScalaハンズオン勉強会

27 views
Skip to first unread message

Kazuhiro SERA

unread,
Jun 23, 2011, 7:46:45 AM6/23/11
to Daimon.scala
瀬良です。

次回ハンズオン勉強会の告知です。

-----
第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

今日、フライング気味にクロージャまで確認しましたが
次回はその続きをやりたいと思います。

よろしくお願いします。

Kazuhiro Sera

unread,
Jun 30, 2011, 10:53:54 AM6/30/11
to Daimon.scala
瀬良(seratch)です。

お疲れ様でした。

今日使ったこの勉強会についての説明資料を共有します。
http://seratch.net/daimonscala/

懇親会も楽しかったですね。
懇親会も定期的にやれるといいと思います。
とりあえずhoriiさんセレクトのワイン会はぜひやりましょう!


On Jun 23, 8:46 pm, Kazuhiro SERA <sera...@gmail.com> wrote:
> 瀬良です。
>
> 次回ハンズオン勉強会の告知です。
>
> -----
> 第4回 JavaエンジニアのためのScalaハンズオン勉強会
> [日時]
> 2011年6月30日(木) 19:00~20:00
> [場所]
> エムスリー株式会社 12F来客用会議室1http://corporate.m3.com/corporate/overview/map.html

谷村直樹

unread,
Jun 30, 2011, 4:49:32 PM6/30/11
to daimo...@googlegroups.com
谷村(naokitanimura)です。

昨日はお疲れさまでした。初参加、楽しかったです。

カリー化についてですが、自宅に帰って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
★★

堀井 俊和

unread,
Jun 30, 2011, 7:16:03 PM6/30/11
to daimo...@googlegroups.com
堀井です。

昨日はお疲れ様でした。

> とりあえずhoriiさんセレクトのワイン会はぜひやりましょう!

やりましょう!
良さそうなのを仕込んでおきます。

堀井
> --
> ---
> Daimon.scala
> http://j.mp/daimonscala
> http://j.mp/daimonscalag


// 堀井 俊和 (Toshikazu Horii)
// toshika...@gmail.com



Kazuhiro SERA

unread,
Jun 30, 2011, 8:50:02 PM6/30/11
to daimo...@googlegroups.com
谷村さん

瀬良(@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>:

Naoki Tanimura

unread,
Jul 1, 2011, 7:54:16 AM7/1/11
to Daimon.scala
谷村(@naokitanimura)です。

> 懇親会でもHaskellの経緯は
> 同じような感じで話に出ていました。

おーっ、そうだったのですか。
次に懇親会があるときにはぜひ参加したいですね。
> 2011/7/1 谷村直樹 <naoki.tanim...@gmail.com>:

btakashi

unread,
Jul 1, 2011, 9:48:26 PM7/1/11
to Daimon.scala
Brianです。

上記で出ている話と大体一緒ですが、Stack Overflowのスレッドはちょっと参考になりました:

http://stackoverflow.com/questions/4684185/why-does-scala-provide-both-multiple-parameters-lists-and-multiple-parameters-per

回答として出てくる:

def foo(as: Int*)(bs: Int*)(cs: Int*) = as.sum * bs.sum * cs.sum

は部分適用、または一つの関数として書き直しにくいと思います。尚、この場合でも

def foo(a: List[Int], b: List[Int], c: List[Int]) = a.sum * b.sum *
c.sum

も悪くないと思うので。。結局時によってはよりきれいな書き方ができる、というのがメリットですかね。

-Brian
> 2011/7/1 谷村直樹 <naoki.tanim...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages