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

余談ですよ:テレビ

[id:naoya:20060217:1140153832]に関して。 我が家では、私の定位置からは、真後ろにテレビがあるので、テレビはついていることは多いものの、テレビを「見て」いることは余りないかも・・・

余談ですよ:German

今日、「ドイツはドイツというのは本当の名前ではなくって、本当はジャーマンなんだ。ジャーマン。ジャーマン」というようなことを連呼している人を見かけたのですが・・・

Concurrent Clean : Clean入門

http://www.geocities.jp/lethevert/softwares/clean/index.html すこし書き足しました。

Concurrent Clean : 例外処理

以下のようなコードがある。 retcode = OK; if (socket.read(name) != OK) { retcode = BAD_READ; } else { processName(name); if (socket.read(address) != OK) { retcode = BAD_READ; } else { processAddress(address); if (socket.read(telNo) != OK) {…

アルゴリズム

ちょうどタイムリーに某コンピューター系雑誌にアルゴリズムの特集がありましたね。よく読んでないですけど。 それはそうと、アルゴリズムというと、ソートのアルゴリズムを必ず説明されるような気がしますけど、ソートアルゴリズムってそんなに大事なんでし…

Haskellのwhereってトップレベルしか使えないって本当?

OSS WebのSICPをHaskellで読むという企画の最近の記事なんですが、 http://oss.timedia.co.jp/index.fcgi/kahua-web/show/Haskell/SICP/1.1#H-5vdgii ただし,Haskell の where 節はトップレベルでのみ使用でき,ネストさせることはできないことに注意してく…

というか、自然言語の問題じゃない?

「そのアルゴリズムは止まるんですか?」 とか 『アルゴリズムの停止性』 とかって、あれですよ。 湯を沸かす 穴を掘る と同じことですよ。 多分、日本語に限らず、どんな自然言語にもあると思いますが、その操作や変化の結果でしかそれを得られないようなも…

Concurrent Clean : サイト更新

http://www.geocities.jp/lethevert/softwares/clean/index.html 読者がいるようなので、少し更新しました。

Concurrent Clean : 便利関数 (3)

while系を中断・再開が可能なように、返値を一つ追加しました。 foldUwhile :: (b a -> b) !b ![(.u -> v:(Bool, a, .u))] !.u -> (!b, ![(.u -> w:(Bool, a, .u))], !.u) ,[v <= w] foldUwhile _ b [] u = (b, [], u) foldUwhile f b [x:xs] u # (c, a, u) …

Concurrent Clean : 副作用と一意型 (3)

[id:lethevert:20060203:p1]では、モナドのアイデアを取り入れる方向で考えていましたが、最近では、リストと高階関数を利用する方向でパターン化することが、より一意型を生かした方法なのではないかと考えるようになっています。ここ数回の便利関数の作成…

Concurrent Clean : Heap Full (6)

[id:lethevert:20060219:p1]で説明したHeap Fullエラーについて、MLで返事がきました。 http://mailman.science.ru.nl/pipermail/clean-list/2006/002968.html 先日の私の解説と大体同じですが、 Start = [0..100001]!!100000なら停止しますよ、という話は、…

Concurrent Clean : 便利関数(2)

[id:lethevert:20060219:p4]に、さらに便利関数を追加です。 reel :: ![(.u -> .u)] !.u -> .u reel [] u = u reel [x:xs] u = reel xs (x u) reelWhile :: ![(.u -> (Bool, .u))] .u -> .u reelWhile [] u = u reelWhile [x:xs] u # (b, u) = x u | b = ree…

Concurrent Clean : 正格性について

一意性と正格性 一意性と正格性は、非常に混乱を招きやすいのですが、2つは全くの別物です。 一意性は、計算の順序を保証しているだけであって、遅延されるかどうかには影響を与えません。標準関数には、正格性注釈をつけているので、そのことに気づきにく…

余談ですよ : システム開発の予算について

正確なパフォーマンスがコードの開発後に決まるのなら、システムのハードウェア構成はコードの開発後にならないと、確定できないのではないかと思った。 ハードウェア構成がコードの開発後になるのなら、コードの開発時に、さまざまなハードウェア構成に対応…

Concurrent Clean & Haskell : インデントによるブロック

Cleanは(そして多分Haskellも)インデントによるブロックを採用しているが、なんでかと思ったら、よく考えたら、文がないから段落もないので、ブロックというものが要らないんじゃないかとか。あ、whereブロックがありますねぇ。

Concurrent Clean : 正格性について(2)

例を挙げて説明してみます。 lazy = x strict :: !a -> a strict a = a strict2 :: !(!a, !b) -> (!a, !b) strict2 (a, b) = (a, b) maketupple :: a b -> (a, b) maketupple a b = (a, b) idtupple :: !(a, b) -> (a, b) idtupple (a, b) = (a, b) 1: idtup…

Concurrent Clean : Heap Full (4)

[id:lethevert:20060218:p1]で見つけたHeap Fullエラーですけど、結局、理由に思い当たりました。 というか、よくよく考えたら、非正格な評価戦略をとっていることからの自然な帰結としてのHeap Fullエラーだったということなのですが・・・ 評価順序を順番…

余談ですよ : 純粋関数型言語は一般に普及するか?

ということを考えたのだが、まぁ、「一般」の意味が良く分からないので、解釈がさまざまに分かれることは必須必至だが、まぁ、余談ネタだということで。 ある程度専門的な集合の中で一般的に普及するかというと、もう既に普及しているんじゃないかと思うので…

Concurrent Clean : Heap Full (5)

[id:lethevert:20060218:p5]で、以下のコードはOKと書いた。 `` :: (!a, !b) -> (!a, !b) `` (a, b) = (a, b) (\(x,y) b = ``(if b (x+1.0) x, y+1.0))しかし、以下のコードはダメだ。 ` :: !a -> !a ` a = a (\(x,y) b = (`$ if b (x+1.0) x, `$ y+1.0))…

Concurrent Clean : 便利関数

ということで、関数適用、タプル、一意型、正格性などに関連する便利関数・演算子をいくつか定義した。これからは、これらを適宜使っていくことにする。 http://www.geocities.jp/lethevert/softwares/clean/customize.html

Concurrent Clean : 文字列のバッファリング (2)

[id:lethevert:20060215:p2]の続き。 正格性に関する注釈を細かく入れることで、Heap Fullエラーを起こさないようになりました。

Concurrent Clean : wc

先の一意型に関する便利関数を利用して、以下のように書けました。すっきり。 Start world #(console,world) = stdio world #(nl,nw,nc) = wc console = toString nl +++ " " +++ toString nw +++ " " +++ toString nc wc :: *File -> (Int, Int, Int) wc f …

Concurrent Clean : Heap Full (1)

[id:lethevert:20060217:p1]や[id:lethevert:20060215:p2]で困っているHeap Fullですが、以下のコードで再現することを確認しました。 import StdEnv Start = [0..]!!100000環境は、以下。 OS : Windows 2000 Professional Clean : 2.1.1 (英語版と日本語化…

Concurrent Clean : Heap Full (2)

どうやら、リストが遅延リストであることが影響しているようです。 リストの正格性については、http://sky.zero.ad.jp/~zaa54437/programming/clean/LanguageReport21/Chap4.html#sc4を参照してください。 [a] : 遅延リスト [!a] : 頭部正格リスト [#a] : 頭…

Concurrent Clean : Heap Full (3)

Heap Fullについて、MLに質問してみました。 それはそうと、以下のように頭部尾部正格リストを使って書いてみたところ、 reduce :: !(b a -> b) !b [!(.u -> (a, .u))!] !.u -> (!b, !.u) reduce _ b [!!] u = (b, u) reduce f b [!x:xs!] u # (a, u) = x u …

SICP : 3.1.2 : Concurrent Clean : モンテカルロ法 : 一意型の扱いについて (2)

[id:lethevert:20060217:p1]では、リストを使っていろいろやってみたのだが、Heap Fullの件が解決できないので、別のアプローチを考えてみた。こちらは、正常に終了する。 Start = estimate_pi 1000000 cesaro_test r # (r1, r) = nextRand r # (r2, r) = ne…

Concurrent Clean : Heap Full (4)

結局、無名関数に名前をつけて、正格性の注釈を入れてやることで、正常に終了するようになりました。 reduce :: (b a -> b) !b [(.u -> (a, .u))] !.u -> (!b, !.u) reduce _ b [] u = (b, u) reduce f b [x:xs] u # (a, u) = x u = reduce f (f b a) xs u c…

Concurrent Clean : Nullable

こんなのはどう? null = \x y = x wrap a = \x y = y a isNull n = n True (\y = False)

SICP : 3.1.2 : Concurrent Clean : モンテカルロ法 : 一意型の扱いについて

[id:lethevert:20060202:p1]で一意型の考察を行っていたが、それに関連する。 モンテカルロ法でPIを推定するという例題。 import StdEnv, OptEnv mapU :: [(.f -> (a, .f))] .f -> ([a], .f) mapU [] f = ([], f) mapU [x:xs] f # (a, f) = x f # (as, f) = …

Concurrent Clean : type variable of type of lifted argument a appears in the specified type

というエラーが以下のコードで発生する。 module lift Start = 1 ::MyType d = MyType d subst :: d (MyType d) -> MyType d subst newdata (MyType data) = inner where inner :: MyType d inner = MyType newdatahttp://mailman.science.ru.nl/pipermail/c…