kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

2009-01-01から1年間の記事一覧

ひょっとしたら役に立つかもしれないScala Tips(4) - パターンの漏れを検出する

ScalaでMLやHaskellのalgebraic data typeを模倣するときの定番は、abstract class(or trait)とcase classを使って、 trait Exp case class Add(l: Exp, r: Exp) extends Exp case class Num(v: Int) extends Exp のようにすることだが、非常に残念なことに…

年越しそばを食べながら今年を振り返ろうオフ in つくば

今年は、論文の締め切りが近いので実家に帰ってもゆっくりできなそうとか諸々の理由でつくばに残って年末年始を過ごすことにしたのだが、せっかくなので以下のようなイベントを企画してみた。暇な人はまあ適当に参加してくださるとありがたいです。 実家に帰…

第17回未来会議

第17回未来会議を以下の日程で開催します。 日時:12月18日(金) 18:30〜 場所:筑波大学 3C213 情報学類生控室(第三エリアC棟2階)(この辺り:(旧)第三学群C棟が地図上には表示されない…) 発表者: @suma90hさん @ranhaさん プログラム: 18:30〜19:10 特別演…

カリー化 != 部分適用

最近、ネット上でカリー化に関する記事を読んでいると、特にGroovy界隈でカリー化に関して誤解がまかり通っているようなので(特に実用的なGroovy: カレー化クロージャーによるファンクショナル・プログラミングはひどい。そもそも、Groovyの標準ライブラリ自…

ひょっとしたら役に立つかもしれないScala Tips(3) - 無名関数+パターンマッチの略記法

久しぶりのScala Tips。Scalaをそこそこ使っている人でも意外と知らない方が多いようなので、一応。たとえば、以下のようなコードがあったとする(やや恣意的な例だが): List("A", 1, 1.0, true, Nil).foreach{e => e match { case _: Int => println("Int")…

this.typeとcloneと型安全性

Scalaでthis.typeとcloneを組み合わせたときに起こる問題について、@cocoa_rutoさんの一連のポストが興味深かったので引用してみる: Scalaでthis.typeなフィールドを持つオブジェクトをcloneしてもそのフィールドは元のオブジェクトを差す。クラスの型メン…

第一回情報科学苦手の会感想・意見等トラックバック用エントリ

第一回情報科学苦手の会は、無事終了しました。参加者の皆さん、どうもありがとうございました。特に、会場を提供していただいた@takeokaさん、運営をお手伝いしてだいた(というか大部分をやってくださった)@syuu1228さん、発表者の皆さん、どうもありがとう…

第1回(?)情報科学苦手の会のお知らせ

情報科学苦手の会 | Google グループに投稿したメッセージの転載です。 皆様: 水島です。遅くなりましたが、第1回情報科学苦手の会をアナウンスさせていただきたいと思います。 日時:2009/12/06 13:00 to 18:00 定員:25名 会場:株式会社アックス 東京支…

scala.Nothingは何のためにあるのか

scala.NothingはScalaのクラス階層における、「一番下」に位置するクラスで全ての型のサブタイプになるが、これが何のためにあるかという点でつまづく人が時々居るようだ。というわけで、scala.Nothingがあると何が嬉しいのかという点をちょっと説明してみよ…

はてなダイアリーのスーパーpre記法がScalaに対応

したらしいので、早速試してみることに。クラス: class Point1(val x: Int, val y: Int) case class Point2(x: Int, y: Int) class Point3(var x: Int, var y: Int) { def aMethod { println("Point3") } } trait: trait Hoge { def display val x: Int var…

Scalaで静的スコープ(かつ、間違った使い方をしにくい) breakの実装

Scala 2.8ではライブラリレベルでbreakがサポートされることになっていて、以下のような感じで使える: breakable { for(i <- 1 to 10) { if(i >= 5) break println(i) } }これはこれで便利だし大変結構なのだけど、このライブラリレベルbreak、どのbreakabl…

情報科学苦手の会の発表(して欲しい)内容募集

Googleグループへの自分の投稿から転載: 皆様:水島です。しばらく放置状態になっててすいません。開催予定時期(12/6)も近づいてきたので、そろそろ内容について考えていきたいと思います。苦手の会の趣旨は(一応)、自分の苦手な分野の話を他の人に教えても…

ScalaでStateモナド

Scalaでは普通に副作用が使えるので、Stateモナドみたいなのの出番はまず無いんだけど、最近Haskellの各種モナドをScalaで書き直すのがマイブーム(死語)なのでやってみた。今回も、All About MonadsのState monadの解説ページの実装丸写しで大した工夫も無い…

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

開催が告知されたのが結構前で、既に枠はかなり埋まっているのですが、一応こちらの日記でも告知しておきます。前回と同じく、Scala言語仕様について、淡々と私(id:kmizushima)が読んで行き、それに対して他の参加者がツッコミを入れるという趣旨の会です。…

第14回 関数脳のつくり方 Second Season 〜モナドで悟りをひらく〜 - 刺激を求める技術者に捧げるScala講座:ITpro へのツッコミ

ITProのScala連載「刺激を求める技術者に捧げるScala講座」の第14回 関数脳のつくり方 Second Season 〜モナドで悟りをひらく〜がはてなブックマークで150ブクマ超えるなど注目を集めていますが、読んで見ると初学者に誤解を与える箇所が散見されるので、一…

日本語ぽく書ける(?)パーザコンビネータ

以前作ったScalaのtoyプログラム色々眺めてたら、なんか発掘されたので、せっかくなので貼っておく。 object ぴーいーじーぱーざこんびねーた { type 構文規則 = 構文解析器[Any] abstract class 構文解析器[+A] extends (String => Option[(A, String)]) { …

第16回未来会議

今年の5月に第15回を開催してから、しばらく中断していましたが、今月末に第16回未来会議を開催します。 * 日時:10月30日(金) 18:30〜 * 場所:筑波大学 3C213 情報学類生控室(第三エリアC棟2階) * 発表者: o 未定 * プログラム:未定(決定次第追記します)…

無名関数リテラルの追加

Onion開発再開しつつある日記といいつつ、めったにOnionのことが話題に上ることが無い日記だが、先月は久しぶりにOnionをいじってたので、それについてちょっと書いてみる。今回の主な変更は無名関数リテラルの追加。今までも、Javaの無名クラスみたいな機能…

Lingr Scala部屋

復活したLingrの方にScala部屋ができたみたいなので、Scalaな人は皆入ると良いと思いますよー。もちろん、Scalaでない人でもScalaに興味があればぜひ。http://lingr.com/room/scalaLingrのアカウント持ってない方はこちらから。http://lingr.com/user/signup…

scala.NotNull

第2回Scala言語仕様輪読会@scala-beにそなえて、Scala Language SpecificationのChapter 3を読んでいて気づいたのだが、scala.NotNullのサブタイプの型はnullを代入できない型になるのね。Scala知って結構経つが知らなかった。 scala> class A defined class…

JavaでContinuationモナド

.@kmizu のScalaのサンプルコードが、まるでPerlのコードのようにイミフだ... http://d.hatena.ne.jp/kmizushima/20090925/1253890980 *P3 http://twitter.com/t_yano/statuses/4370238778 よーし。じゃあ、Javaなら大丈夫ですよね?*1というわけでJavaで書…

Scalaで値を返せるbreak

Scalaでbreakの応用で、ブロックからbreakするときに値を返せるようなものも実現できる。基本的な発想は同じだが、例外のコンストラクタパラメタとして、返すべき値を持たせるところと、ブロックが任意の型を取れるようにパラメタライズされていることが異な…

Scalaでbreak

なんかタイムラインで @yamashiro むしろなかったら作れそうな雰囲気ですよ! 知人のScalaエヴァンジェリスト @kmizu に「何でbreakないの?」と聞いたら「邪道だから」といなされた上で「こうやれば実装できる」と言われましたよw http://twitter.com/_tad_/s…

ScalaでContinuationモナド

Scalaのfor-comprehensionについて、これは単なる拡張for文みたいに機能が限定されたものではなく、モナドを使ったプログラムを簡潔に書ける汎用の構文だよーみたいな説明がよくなされる/したことがある。だが、じゃあ、実際にScalaでforで使えるモナドっぽ…

ScalaでContinuationモナド(改良版)

ScalaでContinuationモナドは、どうにもあまり美しくなかったので、もっとScalaらしく改良してみた。重要な点は、二引数の型コンストラクタCont[R, A]をContinuations[R]の内部クラスContinuation[A]として表現し、flatMap,mapなどはContinuation[A]のメソッ…

第42回情報科学若手の会発表「型レベルプログラミングとScala」

第42回情報科学若手の会のセッション1で「型レベルプログラミングとScala」というタイトルで発表しました。基本的に、型レベルプログラミングの会で発表したスライドをベースに多少修正(型レベル高階関数などの記述を追加)を加えた程度なので、型レベルプロ…

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

前回と同じく、Scala言語仕様について、淡々と私(id:kmizushima)が読んで行き、それに対して他の参加者がツッコミを入れるという趣旨の会です。今回は、Chapter3 Typesを主に読む予定です。前回よりも内容的にはやや難しくなると思いますが、その分面白いと…

何故implicit defが2回呼ばれるのか

(snip) というわけで、 implicit def後も存在しないメソッドを呼び出すようなケースでは、定義済みのimplicit defは試されない (これは当たり前というか実行効率上好都合ですね) 存在しないメソッドを呼ぶ際には、必要な変換に該当するimplicit defただ1つ…

リマインダ:第42回情報科学若手の会

参加申し込み締め切りまで、あと4日(〜8/3231)ですが、まだ枠が余っていますので、興味のある方は是非奮ってご参加ください。名前からは、あかでみっくな人向けっぽくみえますが、そうでない人も例年一定数参加されていますし、非アカデミックな人でも十分に…

型パラメータのErasure

(snip) 今まで、Java では型パラメータは単純に Object になるものだと思っていたんだけど、もしかして extends 使うと一番左側のクラスになる・・・? http://d.hatena.ne.jp/bleis-tift/20090731/1249037236 ちょっと気になったので、JLS(3rd Edition)を調…