2006-09-01から1ヶ月間の記事一覧

Concurrent Clean : 正格性注釈

酒井さんのふりに反応してみようかと。 これまで、Cleanについては型理論な方面について論文をチェックしたりしてきたわけではないので、私の説明は多分に感覚的なものになるのですが。 Cleanの正格性注釈は、新たな型を作り出しているのではなく、式が評価…

Concurrent Clean : カリー化と効率

add :: !Int !Int -> Int add x y = x + yと add :: !Int -> (Int -> Int) add x = \y = x + yを区別する理由を書こうかと思ったのですが、ここを読んでいる人にとってはあたりまえのことになりそうだったので、省略。 要は、低レベルでの関数のアリティが知…

読み方

carは「かー」だと思うけど、 cdrは「くだー」? cadrは「かだー」? caddrは「かだだー」? - (続き) strは、「すとあ」で、 sqrtは、「すくあと」に変換されています。 - cshは、「しーしぇる」で kshは、「けーしぇる」で zshは、「じーしぇる」だけど、…

Concurrent Clean : CleanJ : 予定していた全てのライブラリの移植が完了

http://lethevert.blogspot.com/2006/09/porting-basic-libraries-is-completed.html あとは、cleanj.exeを移植して、移植したcleanjを使って全てのテストを再度実行してみて、動作確認ができたら、バージョン0.9として公開します。

Haskell : モナド

[id:lethevert:20060908:p1]の実装は、なんとなくもっともらしいのですが、実際には、HaskellのIOモナドの実装とは違う挙動を示します。(これは、先にk.inabaさんの指摘で気づいたことですが) 次のような関数を定義して実行すると、 start2 :: () start2 =…

Java : java.io.File

[id:lethevert:20060908:p3]の続き File#getCanonicalPath()を取ってみたら、意図しているディレクトリより上のディレクトリを指していることが判明。 調査続行。 - クラスライブラリを直接確認する方が早そうだと、JODEでFileクラスの実装を確認しようとし…

読み方

bashは「ばっしゅ」でいいのかな? charは「きゃら」と呼んでいたけれど、「ちゃー」と読む人が多いので、最近はそちらで読む。 nullは「ぬる」だったけど、「なる」なの? viは「ぶいあい」と呼んでいるけど、「び」と読むべき? enumは脳内で「えにゅむ」…

Haskell : モナド

当分モナドには触れないつもりだったのですが、ちょっと思いついたので、一つ書いて見ます。 もちろん、副作用がない参照透過なHaskellにとっては全く重要ではないことですが IOを行うモナドをHaskellの自作してみようというネタです。unsafePerformIOという…

Concurrent Clean : リストIO

[id:lethevert:20060905:p1]のコメント欄で思いついたモナドをリストに見て、順番に食わせれば・・・というネタを実装してみようと思ったのですが、 よく考えてみると、Haskellのモナドは左結合ですね。リストは右結合なので、出来上がる構造が逆になってし…

Java : java.io.File

モナドなんかで遊んでいる場合ではないのだ! [id:lethevert:20060905:p5]の問題がまだ解決していないんだ!! Javaが古かったので、最新のjdk1.5に入れ替えたのですが、やっぱりダメでした。むぅ〜。

Haskell, Concurrent Clean : メモリ効率

Haskellのイメージが強いせいか、純粋関数型はメモリ効率がものすごく悪いという印象を与えてしまっているような気がしますが、そんなことはないです、という話。 やれPugsのコンパイルでは1Gもメモリを使うとか、GHCのコンパイルでは(ry、という話を聞く…

面白かった。

http://slashdot.jp/~kaho/journal/373482

Haskell : モナドはややこしい

私の頭ではついていけません! Concurrent Cleanの世界が性にあっている気がする。 というのは、まあ、アレなのですが、IO回りの実装はCleanよりもややこしそうで、その分、処理系を作るのは大変そうな気がしました。

Haskell : モナド : どうやら、まちがっていたようです。

詳細はこちらを -> [id:lethevert:20060904:p1]

Haskell : Identityモナドはどこ?

モナドの調査のためにHaskellをインストールしたのですが、Hugsのminimal版をインストールしたら、Identityモナドが見つからないです。 Control.Monad.Identityをインポートしようとしても、ないといわれる。

Concurrent Clean : マルチスレッド

[id:lethevert:20060903:p2] 自分で、一意性型属性は役に立たないと書いておいて、何を言っていたのでしょう? スレッド間で安全にデータを受け渡すなら、deepSeqしておくべきです。 あと、一意性型属性は破壊的更新を許してしまうので、逆に危険だったよう…

Java : java.io.File

File#exists()が存在しないディレクトリに対してtrueを返す件。

Haskell : モナドの実行順序

(追記:9/5 4:41) このエントリーの内容は、間違っていることが分かりました。詳細はコメント欄にて。 - [id:sshi:20060903:p3], [id:lethevert:20060903:p4], g:hatena:id:jmk:20060903:1157298199の続き。 私はちょっと勘違いしていたことに気づきました…

GNU開発ツール http://www.oversea-pub.com/publications.htm

が届いた。

Concurrent Clean : マルチスレッドとグラフの共有

Cleanでマルチスレッドプログラミングを実装するに置いては、気になるのがグラフの共有。 一見、純粋関数型言語なので全部immutableだからいいじゃん、と思うかもしれないが、Erlangのようにeagerに評価しないので、あるグラフが未評価であった場合に、複数…

fold, pack, instantiate

Recursive Type : fold, unfold Existential Type : pack, unpack Universal Type : instantiate という用語の対応。

Haskell : モナドの実行順序は何によって規定されているのだろうか?

[id:sshi:20060903:p3]より。 私も、bind(>>=)の実装が実行順序を規定していると思います。 http://www.geocities.jp/lethevert/softwares/clean/gettingStarted19.html 上で考察していますが、bind(>>=)で引数を正格評価しないと、意図とは逆の順に評価され…

L.L.Ring

でプレゼント引き換えでもらったボールが、飼猫の遊び道具になっている。 昔は、あまりボール大のものに興味を持たない猫だったのだけれど、最近はそういうものも興味を持つようになったらしい。

Concurrent Clean : CleanJ : ccall

Directoryモジュールを移植するにあたって、ccallというABCマシン命令の仕様を調査中。 ccall Cの関数名 "型指定"という形式で記述され(型指定はクォートされる)、これがC言語の関数の呼び出しに置き換えられる。 型指定の部分は、次のような形式になる。 …

Concurrent Clean : Existential Type & Dynamic

の便利な使い方を考え中。とりあえず、とても昔に下のような記事を書いていて、 http://www.geocities.jp/lethevert/softwares/clean/oop02.html#polymorphic_list そこで、Existential Typeを使っている。(内容は、昔の記事なので、いろいろ突っ込みたいと…

structural subtyping vs. nominal subtyping

structural subtypingは、Cleanにはないのだったということを思い出した。type classには明示的に継承関係を記述する必要があるので、nominal subtypingの一種だよね。 structural subtypingといえばOCamlだと思うのだけれど、それよりも、動的型チェック言…

Concurrent Clean : Process

Start w # (p,w) = createProcess w (g0,p) = createPipe f0 p (g1,p) = createPipe f1 p w = w --> eval (client g0 g1) w = killProcess p w = w where f0 :: a *World -> *World f1 :: *World -> (a,*World)で、 g0 :: a -> Unit g1 :: Unit -> a

Concurrent Clean : Dynamic

Cleanには、Dynamicという機構があって、プロセス間通信などを型安全に行うことができる。 http://sky.zero.ad.jp/~zaa54437/programming/clean/LanguageReport21/Chap8.html 昨日のプロセス間通信を使った副作用の表現は、Dynamicを使って実現できるだろう…

Concurrent Clean : Erlangのようなマルチプロセスプログラミングを行うには

どうすればいいのだろうか? createServer :: !(a -> *World -> *World) !*World -> ((a u:b -> u:b), *Server, *World) shutdownServer :: !*Server !*World -> *World eval :: !a !u:b -> u:b eval a b = b Start w = w --> createServer receive --> \(se…

Concurrent Clean : Lazy vs. Strict

CleanはLazyな言語として知られているのですが、正格性型注釈がとても便利なので、LazyとStrictのハイブリッド言語と捉えておく方が認識としては正しいように思います。なので、下のような正格評価を期待するプログラムも、Cleanとしてはありなのではないか…