2005-07-19 [長年日記]
λ. Central-European Functional Programming School
Varmo Vene: Signals and Comonads に興味があったのだけど、この講義の資料は公開されてないっぽいな。残念。……と思ったら、あった。Interp.tgz に含まれてるのか。後で読んでみよう。
- Varmo Vene: Signals and Comonads
-
「fby」は「followed by」の略で、「wvr」は「whenever」の略らしい。 ストリームを利用したプログラミングではよく出てくる演算子らしいけど、知らなくて最初何かと思った。
(2005-09-29 追記) 会場では Tarmo Uustalu1 and Varmo Vene. The Essence of Dataflow Programming (LtU) が資料として配布されていたそうで、そっちにはかなり詳しく書いてあった。面白い。
λ. るびま 0008 号
「おすすめのライブラリ」の話だけど、tsortはopen-uriやppほどじゃないけど何度か使ったことがある。少なくとも、resolve.rbよりは使ってる。
trapの話は知らかった。キャンセレーションポイントといえば Thread#kill や Thread#raise といったメソッドの問題をまず想像した。ちなみに、これは今非常によろしくなくて、例えばensureの中で実行がキャンセルされると悲惨なことに成りえる(e.g. [ruby-dev:23619])。[ruby-dev:23619]の問題に限って言えば、Mutex や ConditionalVariable をCで実装すれば解決できるのだけど、この問題の本質はRubyのスレッド/同期のプリミティブが compositionality を欠いているということなのだと思う。
それと、「だいたい、アプリケーションて 2 種類あると思うんですよ。IO をするスレッドというかプログラムと、計算をして黙り込んでいるプログラムがあると思うのですが、IO のほうは途中で止めるときは、自分でここは止まる可能性があると宣言するか、あるいはブロックするところで止まるのがいいのではないかと思うのですが。(中略) で、計算するほうはぷちっと殺してもいいことがありまして、それはそれでいきなり殺す、つまりキャンセレーションポイントを宣言しなくても殺せる意味で、この二つの使い方を両方サポートするにはどうしたらいいかということですかね」という点は興味深いな。
ちなみに、Haskellでは型によってIOアクションの実行と普通の計算を区別しているので、この問題には自然に対処出来ていると思う。IOアクションの実行に関しては普通にキャンセレーションポイントの概念を持っているのに対して、後者の普通の計算については(処理系的には)いつでもプチっと殺してしまえる。実際、STMモナド(see Composable memory transactions)では型によってIOアクションの実行が含まれないことが保障されているので、トランザクションに失敗した時点でプチっと実行をキャンセルして、後で再実行する。
「興味を持っているテーマ」のSQL(とRDB)のindexの話は面白いな。SQLのこうした発想は Data Structures Considered Harmful といった発想にも繋がっていたはず。(FIXME)
λ. 有限体GF(p)
ふと、有限体を扱うための簡単なライブラリが欲しくなったので、書いてみた(GF.hs)。有限体といっても、素体(prime field)だけで、拡大体(extension field)は扱えないけどね。
書いていて感じたのだけど、型クラスを compile-time prolog として使うと、本物の prolog との違いで結構はまるね。
それと、拡大体をこういうアプローチで扱うにはどうしたらよいのだろうか。原始多項式にどの既約多項式を使おうと結果は全て同型なわけで、既約多項式を明示するのは馬鹿らしい。標準的な既約多項式みたいなのはあるのだろうか? そして拡大体の元の標準的な表記法はあるのだろうか?
【2008-04-29 追記】 どう書く?orgの「法演算」のお題にnobsunが同様の方法を使って答えていたので、このコードも転載してみた。