第1回Scala言語仕様輪読会のお知らせ

53 views
Skip to first unread message

kmizushima

unread,
Jul 31, 2009, 10:10:14 AM7/31/09
to scala-be
皆様:

こんにちは。水島です。当初の予定よりだいぶ遅れてしまいましたが、8/14(土)から第1回Scala言語仕様輪読会を開始したいと思います。皆様の
参加をお待ちしています。疑問点や不備などありましたら、このスレッドなどで遠慮無くご指摘いただければと思います。

--
第1回Scala言語仕様輪読会@scala-be

日時 / DATE :
2009/08/14 18:30 to 21:00

定員 / LIMIT :
30 人(暫定)

会場 / PLACE :
豆蔵トレーニングルーム(新宿三井ビル34階) (東京都新宿区西新宿二丁目1番1号)

参加方法:
 http://atnd.org/events/1197 から参加表明していただいた上で、会場に直接ご来場ください。
--

詳細については、http://atnd.org/events/1197 をご覧ください。

Kota Mizushima

unread,
Jul 31, 2009, 10:13:43 AM7/31/09
to scala-be
すいません。曜日が間違ってました。8/14(土)でなく、8/14(金)でした。

2009/07/31 23:10 に kmizushima<mizu...@gmail.com> さんは書きました:

--
Kota Mizushima
e-mail: mizu...@gmail.com

Kenichi Kobayashi

unread,
Aug 18, 2009, 10:04:51 PM8/18/09
to scal...@googlegroups.com
小林@豆蔵です。

8/14の勉強会ではみなさま、ありがとうございました。

勉強会の場で聞き忘れたのですが、
みなさん、Scalaで開発するときにはどんな開発環境を
使ってらっしゃいますか。

私はVimを特に工夫もせず使っています。

作業中の工夫(?)として、
・ScalaのライブラリAPIをWindowsHelp化
・scala対話環境上でメソッドを調べたいときは
>List.getClass.getMethods.foreach(println)
などとして一覧を表示する。

といったことをしています。

みなさんが開発環境で工夫、苦労されていることが
ありましたら、教えていただけませんでしょうか。

#EclipseやNetBeansのpluginが安定してくれれば・・・


--
(株)豆蔵  小林健一
〒163-0434
東京都新宿区西新宿二丁目1番1号
新宿三井ビルディング 34階 私書箱302号
TEL: 03-5339-2165(BS事業部教育), FAX: 03-5339-1795
URL: http://www.mamezou.com/
E-mail: koba...@mamezou.com

YAMASHIRO Shunsuke

unread,
Aug 18, 2009, 10:21:43 PM8/18/09
to scal...@googlegroups.com, s-yam...@nri.co.jp
山城です。

NetBeansのpluginは、大き目のファイルには弱いようです。小さいファイルを扱っ
ていても時々フリーズするときがありますが...。

なので基本、(秀丸 or Meadow) + Maven という構成をとっています。なんの変
哲もない構成ですが、安定しています(あたりまえか...)。

APIマニュアルは vscaladoc を参照しています。名前で検索機能が重くて使えな
いのが痛いです。小林さんの Windows Help が気になるところです :D

そんなとこです。
--
山城 俊介 (YAMASHIRO Shunsuke)

(株)野村総合研究所 情報技術本部 共通基盤推進部
〒240-0005 横浜市保土ケ谷区神戸町134 NRIタワー 17F
Tel. 045-336-8037 Ext. 7-3449
Fax. 045-336-1416 Ext. 7-4796
E-mail:s-yam...@nri.co.jp
http://www.nri.co.jp/

Kenichi Kobayashi

unread,
Aug 18, 2009, 11:33:40 PM8/18/09
to scal...@googlegroups.com, s-yam...@nri.co.jp
山城さん
小林@vscaladocを分かってなかった・・・です。

ありがとうございます。

WindowsHelp化(chmファイル化)は巷のフリーウェアで
簡単にできます。単語検索が軽快ですのでお薦めです。

やはり普通にエディタで開発するのが一番なのか。
NetBeansもよく止まりますね。


YAMASHIRO Shunsuke さんは書きました:

Kenichi Kobayashi

unread,
Aug 19, 2009, 4:27:50 AM8/19/09
to scal...@googlegroups.com
小林@豆蔵です。

勉強会(8/14)ネタの続きです。

S-99(http://aperiodic.net/phil/scala/s-99/)の問題をみんなで
考えたところ、第1問(リストの最後の要素を取得する)の回答が
いくつか出ました。

class Last {
def last1[T](l:List[Int])= l.last

def last2[T](l:List[Int]) = l.reverse.head

def last3[T](l:List[Int]) = l.reverse.first

def last4[T](l:List[Int]) = l.reduceLeft((x, y) => y)
}

いろいろできるなぁ、というだけでは面白くないので、
自分のマシンでそれぞれの関数を100万回回して
速度を調べてみました。結果は・・・

last1 577.6ms
last2 998.4ms
last3 1086.0ms
last4 817.8ms

で、組込み関数が速いのは当然かとおもいますが、
案外reduceLeftが健闘しますね。

Ryoichi Izumita

unread,
Aug 21, 2009, 10:24:50 AM8/21/09
to scal...@googlegroups.com
和泉田です。

Scalaは少しずつ勉強しているのですが、Komodo IDEのシン
タックスカラーリングを自作して使ってます。補完も実装できれば
良いんですが。

----------
和泉田 領一
r.iz...@caph.jp

Kenichi Kobayashi

unread,
Aug 28, 2009, 11:41:17 PM8/28/09
to scal...@googlegroups.com
みなさま
小林@豆蔵です

Scalaライブラリの実装が反復ばかりなのに
「Scalaスケーラブルプログラミング」P156で、
「両者はほとんど同じ速さである」というのが気になったので、
同じ処理を反復と再帰で書いた場合の時間測定をしてみました。

手元のCore2Duo2.40GHzマシンでは、
再帰の方が1.2倍の時間がかかるようです。
確かにライブラリにとっては無視できない速度ですね。

バイトコードを見てみると、再帰のコードを
反復に変換しているわけではないようです。
毎回メソッドを呼び出してますね。
末尾再帰の最適化をやってないように見えるんですが、
どうなってるんでしょうか。
-------------------------------------------------------
public double approximate(double);
Code:
Stack=4, Locals=3, Args_size=2
0: aload_0
1: dload_1
2: invokevirtual #18; //Method isGoodEnough:(D)Z
5: ifeq 12
8: dload_1
9: goto 21
12: aload_0
13: aload_0
14: dload_1
15: invokevirtual #21; //Method improve:(D)D
18: invokevirtual #30; //Method approximate:(D)D ←ココ(@_@)
21: dreturn
LineNumberTable:
line 9: 0
line 10: 12
line 9: 21
-------------------------------------------------------


実行したコード
------------------------------------------------------------------
class Approx {
def isGoodEnough(guess:Double):Boolean =
if (guess < 1) true
else false

def improve(guess:Double): Double = guess - 1

def approximate(guess:Double):Double =
if (isGoodEnough(guess)) guess
else approximate(improve(guess))

def approximateLoop(initialGuess:Double):Double = {
var guess = initialGuess
while (!isGoodEnough(guess))
guess = improve(guess)
guess
}
}

object ApproxMain {
val app = new Approx()
def main(args:Array[String]) = {
recursive(1)
iterate(1)

recursive(1)
iterate(1)
recursive(1)
iterate(1)

recursive(10)
iterate(10)
recursive(10)
iterate(10)

recursive(100)
iterate(100)
recursive(100)
iterate(100)

recursive(1000)
iterate(1000)
recursive(1000)
iterate(1000)
}

def recursive(n:Int) = {
val start = java.lang.System.currentTimeMillis()
for (i <- 0 to 10000000) {
app.approximate(n)
}
println(java.lang.System.currentTimeMillis() - start)
}

def iterate(n:Int) = {
val start = java.lang.System.currentTimeMillis()
for (i <- 0 to 10000000) {
app.approximateLoop(n)
}
println(java.lang.System.currentTimeMillis() - start)

KAZUu

unread,
Aug 29, 2009, 12:51:29 PM8/29/09
to scala-be
小林様:

はじめまして、坂本と申します。

approximate メソッドは class の public なメソッドですので、
別のクラスによってオーバーライドされる可能性があります。
そのため、メソッド呼び出しの除去が不可能なのだと思います。
> E-mail: kobaya...@mamezou.com

中村 正

unread,
Aug 29, 2009, 1:09:06 PM8/29/09
to scal...@googlegroups.com, koba...@mamezou.com
中村@豆蔵です.


既に回答がありますが,overrideの可能性のため,
最適化不可能なのかと.

なので,classをobjectにするかメソッドをfinalに
すると想定したものが得られますね.
#ちなみにobjectにすると実体であるJavaの
#classがfinalになるため


以上,よろしくお願いします.
-----
NAKAMURA Tadashi

Kenichi Kobayashi

unread,
Aug 30, 2009, 10:55:31 AM8/30/09
to scal...@googlegroups.com
中村さん、坂本さん
小林です。

ありがとうございます。
確かにfinal def...にすると以下の通りですね。
--------------------------------------------------------
public final double approximate(double);
Code:
Stack=3, Locals=4, Args_size=2


0: aload_0
1: dload_1
2: invokevirtual #18; //Method isGoodEnough:(D)Z

5: ifeq 10
8: dload_1
9: dreturn
10: aload_0
11: dload_1
12: invokevirtual #21; //Method improve:(D)D
15: dstore_1
16: goto 0
--------------------------------------------------------
実行速度も反復とほとんど変わりません。


中村 正 さんは書きました:

--

尾崎智仁

unread,
Sep 1, 2009, 2:06:49 AM9/1/09
to scal...@googlegroups.com
ゆろよろ(尾崎)です。

Scalaのインタプリタ上で、scaladocを表示するツールを作りました。

http://github.com/yuroyoro/InteractiveHelp/tree/master
http://d.hatena.ne.jp/yuroyoro/20090901/1251780579

インタプリタ上で、h("List")とか入力するとscaladocが見れます。
こんな感じです。
------------------------------------------------------------------------------------
scala> h("List")(0)
=== scala.List ==================================================
sealed abstract class List[+A]
extends Seq[A] with Product

A class representing an ordered collection of elements of type
a. This class comes with two implementing case
classes scala.Nil and scala.:: that
implement the abstract members isEmpty,
head and tail.

================================================================
------------------------------------------------------------------------------------

自分で作っておいて何ですが、鼻血が漏れ出すくらい便利なのでぜひ使ってやってくださいm(_)m

2009年8月19日11:04 Kenichi Kobayashi <koba...@mamezou.com>:

Kenichi Kobayashi

unread,
Sep 1, 2009, 6:25:09 AM9/1/09
to scal...@googlegroups.com
尾崎さん
小林です。

ありがとうございます。
これめちゃくちゃ便利です。
IDE苦手な私にとっては理想の環境です。


尾崎智仁 さんは書きました:

Kenichi Kobayashi

unread,
Sep 10, 2009, 9:03:51 PM9/10/09
to scal...@googlegroups.com
皆様
小林健一@豆蔵です。

10/2(金)19:00より、第2回Scala言語仕様輪読会を開催します。
前回参加できなかった方もぜひご参加ください。

--
第2回Scala言語仕様輪読会@scala-be

日時 / DATE :
2009/10/02 19:00 to 21:00

定員 / LIMIT :
25 人(暫定)

会場 / PLACE :
豆蔵トレーニングルーム(新宿三井ビル34階) (東京都新宿区西新宿二丁目
1番1号)

参加方法:
http://atnd.org/events/1523 から参加表明していただいた上で、会場に直
接ご来場ください。
--

kmizushima

unread,
Sep 11, 2009, 10:51:42 AM9/11/09
to scala-be
水島です。

小林様:

アナウンスとか日程調整とか完全にお任せしてしまってすいません。

皆様:

今回読む3章はScalaの型に関する部分なので、前回よりも難易度が高いと思いますが、
その分面白いと思うので、ぜひご参加ください。
> E-mail: kobaya...@mamezou.com

Kenichi Kobayashi

unread,
Sep 30, 2009, 11:04:12 PM9/30/09
to scal...@googlegroups.com, Kenichi Kobayashi
皆様
小林@豆蔵です。

リマインダです。
予定通り、10/2(金)19:00より
第2回Scala言語仕様輪読会を開催します。

前回に引き続き盛り上がって参りましょう。


Kenichi Kobayashi さんは書きました:

Hanyuda Eiiti

unread,
Sep 30, 2009, 11:26:35 PM9/30/09
to scal...@googlegroups.com, Kenichi Kobayashi
豆蔵の羽生田です。

小林さん リマインダーありがとうございます。
水島さん 講師よろしくお願いします。

それから、この会は仕様の輪読が趣旨ではありますが、
前回も簡単なScalaの例題で盛り上がりましたので、
もしどなたか、Scalaに関するコネタをお持ちの方は
ぜひ5分でも10分でも発表していただければ幸いです。

よろしくお願いいたします。
株式会社 豆蔵 MAMEZOU CO., LTD (http://www.mamezou.com/) 取締役CTO
豆蔵ソフト工学ラボ (http://labo.mamezou.com/) 所長
羽生田栄一 Hanyuda Eiiti (han...@mamezou.com)
Tel: 03-5339-2161 Fax: 03-5339-1795

Kota Mizushima

unread,
Oct 1, 2009, 1:35:09 AM10/1/09
to scal...@googlegroups.com
皆様:

水島です。

昨日、今回の輪読会で読む範囲を予習してたのですが、なかなか手ごわそうです。
皆様も、当日、疑問点などがあれば遠慮無くその場でツッコんでいただければと
思います。あと、たぶん2時間だとChapter 3は読みきれない気がするので、残った
分は次回以降ということになるかもしれませんが、ご了解いただければと思います。

2009年10月1日12:26 Hanyuda Eiiti <han...@mamezou.com>:

--
--
Kota Mizushima
e-mail: hau5...@tree.odn.ne.jp,mizu...@gmail.com

tqj0...@nifty.com

unread,
Oct 17, 2009, 4:30:50 AM10/17/09
to scal...@googlegroups.com
皆様、

鈴木です。

第2回Scala言語仕様輪読会に参加させていただき、ありがとうございました。

教えていただきたいのですが

scala> type of[m[_],t] = m[t]
defined type alias of

scala> var x: List of Int = List(1,2,3)
x: of[List,Int] = List(1, 2, 3)

この"List of Int"という表記ができることが、Scala Specのどの辺に書いてるのでし
ょうか?

よろしくお願いいたします。


tmiya

unread,
Oct 17, 2009, 8:24:51 AM10/17/09
to scala-be
On 10月17日, 午後5:30, tqj00...@nifty.com wrote:
> この"List of Int"という表記ができることが、Scala Specのどの辺に書いてるのでし
> ょうか?

多分、3.2.8 Infix Type だと思います。typeに対するinfix operator を of という名前で定義した、という話か
と。
型を定義する type キーワードの使い方に関しては 4.3 も参照すると良いです。(あるいは 4.4 あたりも?)

Kota Mizushima

unread,
Oct 18, 2009, 7:17:31 AM10/18/09
to scal...@googlegroups.com
内容的に自分が回答すべきだった気がするのですが、代わりに
回答してもらってすいません>tmiyaさん

tmiyaさんのおっしゃる通りで、3.2.8 Infix Typesにそのことが書かれています。
3.2.8の最初の段落から引用すると、以下の通りです。T1 op T2のように書いた場合、
op[T1, T2](今回の例で言うとof[List, Int])と同じ意味になるということですね。

> An infix type T1 op T2 consists of an infix operator op which gets applied to two
> type operands T1 and T2. The type is equivalent to the type application op[T1,T2].
> The infix operator op may be an arbitrary identifier, except for *, which is reserved
> as a postfix modifier denoting a repeated parameter type (§4.6.2).

2009年10月17日21:24 tmiya <tm...@bu.iij4u.or.jp>:

--
Kota Mizushima
e-mail: hau5...@tree.odn.ne.jp,mizu...@gmail.com

Kenichi Kobayashi

unread,
Oct 18, 2009, 9:56:45 PM10/18/09
to scal...@googlegroups.com
皆様
小林@豆蔵です。

11/11(水)19:00より、第3回Scala言語仕様輪読会を開催します。

前回はかなりハードな内容でしたが、それだけに興味深い内容でした。
今度もその続きから進めていきます。

会場は今回、トレーニングルームではなく大会議室になります。
新宿三井ビル34F南側ですのでご注意ください。

------------------------------------------------------------

第3回Scala言語仕様輪読会@scala-be

Scala言語仕様をがんがん読んでみる

日時 / DATE :
2009/11/11 19:00 to 21:00

定員 / LIMIT :
20 人

会場 / PLACE :
豆蔵大会議室(新宿三井ビル34階南側) (東京都新宿区西新宿二丁目1番1号)

参加方法:
 http://atnd.org/events/1865 から参加表明していただいた上で、
会場に直接ご来場ください。

tqj0...@nifty.com

unread,
Oct 19, 2009, 10:21:25 AM10/19/09
to scal...@googlegroups.com
tmiyaさん、Mizushimaさん、

ありがとうございます。確かに3.2.8 Infix Typesにありました。

3.2.8 Infix Typesは右結合のところだけに眼が行って最初の段落を見逃していました

ところで"two type operands T1 and T2."の"""two"""は三つ以上は、論理的に無理な
のでしょうかそれとも、使えても嬉しくないだけなのでしょうか?

> --‾--‾---------‾--‾----‾------------‾-------‾--‾----‾
> このメールは次の Google グループの参加者に送られています: scala-be
> このグループにメールで投稿: scal...@googlegroups.com
> このグループから退会する: scala-be+u...@googlegroups.com
> その他のオプションについては、次の URL からグループにアクセスしてくださ
> い。 http://groups.google.com/group/scala-be?hl=ja
> -‾----------‾----‾----‾----‾------‾----‾------‾--‾---
>

Kota Mizushima

unread,
Oct 19, 2009, 11:19:11 AM10/19/09
to scal...@googlegroups.com
水島です。

もちろん、三つ以上にすることも論理的には可能だと思います。
ただ、その場合一体どういう文法にすべきかが割と難しいところ
ではないでしょうか?たとえば、3 type operandsを持つ場合を
考えてみると:

(T1, T2) op T3
それとも
(T1) op (T2, T3) ?

他にも色々候補はあると思うんですが、どう文法を考えても
左右どっちかに偏ってしまい、なんか微妙な気がします。

2009年10月19日23:21 <tqj0...@nifty.com>:

Kenichi Kobayashi

unread,
Nov 10, 2009, 12:59:57 AM11/10/09
to scal...@googlegroups.com
皆様
小林@豆蔵です。

明日11/11(水)19:00より、予定通り
第3回Scala言語仕様輪読会を開催します。

まだ座席にい余裕がある、かもしれませんので、
「忘れてた!」と言う方はあわてず、
参加登録を行ってください。

では、当日会場でお会いしましょう。

Kenichi Kobayashi さんは書きました:

Kota Mizushima

unread,
Nov 10, 2009, 2:05:22 AM11/10/09
to scal...@googlegroups.com
小林さん:

アナウンスありがとうございます。

皆様:

今回は、Chapter 3の後半~Chapter 4の前半という構成になると思います。特にChapter 3後半は
ややこしいので、一通り目を通されることをお勧めします。

2009年11月10日14:59 Kenichi Kobayashi <koba...@mamezou.com>:

--
Kota Mizushima
e-mail: hau5...@tree.odn.ne.jp,mizu...@gmail.com

Kenichi Kobayashi

unread,
Nov 12, 2009, 5:00:10 AM11/12/09
to scal...@googlegroups.com
みなさま
小林@豆蔵です。

第3回Scala言語仕様輪読会では、結構ディスカッションが
ありました(なにしろ高階型パラメータとか
スコーレム標準形とか出まくりですし)。

私がコメントを付けたPDFを
091111_ScalaReferenceWithComment.pdf
として格納しておきました。
http://groups.google.co.jp/group/scala-be/files

次回も面白いところが続きますのでお楽しみに。


Kota Mizushima さんは書きました:

tqj0...@nifty.com

unread,
Nov 14, 2009, 6:17:26 AM11/14/09
to scal...@googlegroups.com
鈴木です。

ありがとうございました。返事が遅れてすみません。
(今回参加できなくて残念です)

> 左右どっちかに偏ってしまい、なんか微妙な気がします。
確かに微妙です。

少し話は違いますが、以下を試してみたのですが
var y: List of List of Int はだめでした。(version 2.7.0)

scala> var y: List of List of Int = List(List(1,2,3), List(4,5,6))
<console>:5: error: class List takes type parameters
var y: List of List of Int = List(List(1,2,3), List(4,5,6))
^
scala> var y: List of List[Int] = List(List(1,2,3), List(4,5,6))
y: of[List,List[Int]] = List(List(1, 2, 3), List(4, 5, 6))

変な質問だと思いますが、
1 + 2

List of Int
は何が違うのでしょうか? operatorとtypeの違いとは何なのでしょうか?単に言語とし
て使っている分には問題ないのですが。また、どの辺まで遡れば一緒なのでしょうか?

よろしくお願いします。

----- Original Message -----
> Date: Tue, 20 Oct 2009 00:19:11 +0900
> Subject: [scala-be] Re: 第2回Scala言語仕様輪読会の内容への質問
> From: Kota Mizushima <mizu...@gmail.com>
> To: scal...@googlegroups.com
>
>

> > ?to two


> >> > type operands T1 and T2. The type is equivalent to the type application
op
> > [T1,T2].
> >> > The infix operator op may be an arbitrary identifier, except for *, whi
ch
> > is reserved
> >> > as a postfix modifier denoting a repeated parameter type (§4.6.2).
> >>
> >>
> >>
> >> 2009年10月17日21:24 tmiya <tm...@bu.iij4u.or.jp>:
> >> >
> >> > On 10月17日, 午後5:30, tqj00...@nifty.com wrote:
> >> >> この"List of Int"という表記ができることが、Scala Specのどの辺に書いて
るの
> > でし
> >> >> ょうか?
> >> >
> >> > 多分、3.2.8 Infix Type だと思います。typeに対するinfix operator を of
とい
> > う名前で定義した、という話か
> >> > と。
> >> > 型を定義する type キーワードの使い方に関しては 4.3 も参照すると良いです

> > (あるいは 4.4 あたりも?)
> >> >
> >> > >
> >> >
> >>
> >>
> >>
> >> --
> >> Kota Mizushima
> >> e-mail: hau5...@tree.odn.ne.jp,mizu...@gmail.com
> >>
> >> --‾--‾---------‾--‾----‾------------‾-------‾--‾----‾
> >> このメールは次の Google グループの参加者に送られています: scala-be

> >> ?このグループにメールで投稿: scal...@googlegroups.com
> >> ?このグループから退会する: scala-be+u...@googlegroups.com
> >> ?その他のオプションについては、次の URL からグループにアクセスしてくださ

Reply all
Reply to author
Forward
0 new messages