GHCで最適化オプションを付けるとヒープが溢れる.
最適化を付けないと,速度が大分落ちるのでこれでは困る・・・
解決しようにも,どこがヒープを食ってるのかさっぱり分からないので
GHCのドキュメントを読んでみた.
どうやらGHCにはプロファイリングの機能が付いているようだ.
http://www.haskell.org/ghc/docs/latest/html/users_guide/flag-reference.html#id3131041
http://www.haskell.org/ghc/docs/6.4.2/html/users_guide/hp2ps.html
こんな感じに使う(ps2pdfはGHCに付属しません)
ghc --make -prof -auto-all Main.hs ./main.exe +RTS -h hp2ps.exe main.exe.hp ps2pdf main.exe.ps main.pdf
これでプロファイリングの結果がPDFでみれる.
今度まとめておこう.
ついでに,実行時に+RTS -Bでガベージコレクトが行われる度に,ビープ音を鳴らしたり
Language Lines of code Lines of documentation Development time (hours) (1) Haskell 85 465 10 (2) Ada 767 714 23 (3) Ada9X 800 200 28 (4) C++ 1105 130 ? (5) Awk/Nawk 250 150 ? (6) Rapide 157 0 54 (7) Griffin 251 0 34 (8) Proteus 293 79 26 (9) Relational Lisp 274 12 3 (10) Haskell 156 112 8
HaskellとLispすげー.C++やべー.
Lispで3時間で書けるプログラムが,C++だと60時間かかっても書けないって...
夏休み中はSchemeでもやってみよう.
うちの大学のサークル棟には,インターネットに接続できる環境がありません.
ちょっと不便なので,「一番近くに住んでいるメンバの家から,無線LANの電波を飛ばそう」
という計画がありました(なんと窓と窓の間に,壁が全く無いのです.)
少し距離があるので,指向性のあるアンテナを買おう,とか話をしている時に
冗談で,「中華鍋でいいじゃん」というような話をしていたのですが
Uni-Directional WIFI Range Extender
蒸し器を使って,似たような事をやっている人がいました・・・.
>This works even better than I thought it would. 『思った以上に効果があったよ.』
信じ難いです^^; 同じタイプの蒸し器を持っているので,試したい衝動に駆られます.
研究室にHaskellを始めた人がいる.
その人が,Haskellでプログラムを書く時には,どうしても再帰が沢山出てきて
慣れが必要だなぁ.とぼやいていた.
Haskellはリストを処理して,ほとんどの処理をする事になるので
再帰を使うと綺麗に処理する事ができますが
たしかに,何でも再帰を使って書くのは面倒だ.
関数型言語では,全ての関数を等号で繋ぐ事で,プログラムを書いていく.
つまり,やりたい事=分割された問題...
をひたすら書いていく事になる.これは,何をやりたいのか,という事を等号で繋ぐだけなので
うまく表現できると,ソースコードがそのままコメントになるほど美しいコードが書ける.
しかし,例えば乗算をする関数を考える.
mult _ 0 = 0 mult a b = a + mult a (b-1)
マイナスの値でかけれなかったりで, 色々バグだらけだが,再帰で書くとこんな感じだろう.
しかし,乗算を子供の頃に
「りんごが3個入った籠が2個あると,全部でりんごがいくつ?」
と習ったであろう私達には違和感がある.
実際,multの定義は
「3*2は 3*1 に3足した物」
となっている.まぁだから再帰なのですが...
再帰は確かに便利だが,コードが直感的でなくなる事がよくあるように思う.
それなら,再帰をなるべく使わずに書いてみよう.というか,再帰の部分は標準ライブラリに任せてしまおう.
と寝る前に考えてみた,再帰を使わないmult2の定義はこんな感じ.
mult2 a b = foldl1 (+) $ replicate a b
「b個のりんご,がa個あると全部でいくつ?」
直感的なコードになっていると思います
友達8人で,大町のキャンプ場でキャンプをした.
天気は生憎の雨でしたが,湖で泳いだり騒いだり.
キャンプ場の駐車場に,怪しい車が大量に止まっていた...
エンボス加工されたテトリスをプレイする為に,Meadowのバージョンを3.0にあげてみた.
大きいツールバーが邪魔だったので,公式のマニュアルで消し方を探したが,ややこしい方法しか書いていなかった.
M-xしてtool[tab]としたら,tool-bar-modeが見つかったので,.emacsに
(tool-bar-mode nil)
を追加しといた.
研究室のTkd君がHaskellを始めた.よし
それとは別で,Eitherな型を返すリストから,種類別にリストを得たい.
つまりこんな関数 hoge :: [Either Fuu Bar] -> ([Fuu], [Bar])
newtype Odd = Odd Integer deriving Show newtype Even = Even Integer deriving Show nums :: [Integer]->[Either Odd Even] nums [] = [] nums (n:ns) = if n `mod` 2 == 0 then Right (Even n):nums ns else Left (Odd n):nums ns o_e :: [Either Odd Even]->([Odd], [Even]) o_e [] = ([],[]) o_e (n:ns) = let (os,es)= o_e ns in case n of Left o -> (o:os, es) Right e -> (os , e:es)
Prelude> o_e $ nums [1..6] ([Odd 1,Odd 3,Odd 5],[Even 2,Even 4,Even 6]
作った後で,今回は他の方法でいけると気づいたので,結局使わなかったけれど... メモ
Haskellにはデバッガという物が存在しません.
これは,一般的にHaskellがバグフリーと言われている事と,対話環境との親和性が高いからだと思います.
実際,関数を定義した後には,deriving Showされたデータを対話環境を使って表示し
正しく動いているかを確認する事ができます.
Prelude Xml> atoi \"3456789876545678\" 3456789876545678
所が,(a->a)のように,deriving Show出来ないデータ型も存在します.
私が今書いているプログラムでは,「関数のリスト を返す 関数」の動作が肝なのですが
ちゃんと動いているか不安です.
仕方が無いので
newtype Hoge a = Hoge (String, a->a) instance Show (Hoge a) where show (Hoge h) = fst h
とかやってデバッグしてみたのですが,型構築子のせいで普通のalistとして扱えません.少し不便.
instance Show (String, a->a) where show (s,_) = s
みたいにできたら便利なのですが...(遅延評価で何とかならないのでしょうか...)
Haskellでパーサを書いている時に,Cのatoi的な事をやらせたくなったので書いてみた.
atoi :: Integral a=>String->a atoi s = foldl1 (+) $ zipWith (*) (map (10^) [0..]) (reverse $ map (fromIntegral.digitToInt) s)
もっと綺麗に書けないかなぁ(汗
そもそも,標準ライブラリにありそうな気がする.
で,XMLのパーサを書いていたのだが,100行程度のコードであっという間に書けた.
HaXMLで,exampleすらコンパイルできずに苦労していたので
最初から自分で書けばよかったと後悔...
やっぱり,Parsecは便利だ(perl + 正規表現の方が楽かとも思いますが
今日は大学生協のビア樽祭(ビアガーデン)最終日.
天気が悪く,水,木とお客さんが少なかったので,週末の最終日には期待していたのですが
結局,例年の半分ほどのお客さんしか来ませんでした.
それでも,今年は知り合いが(声をかけてない人を含めて)沢山きてくれたので,私は楽しかった.
片づけが終わってからは,余ったお酒やおつまみ,それと生協からの差し入れのお寿司で飲み食い.
12時頃に,生協を後にしてNTRの家で二次会.
生協学生委員に今年入った後輩とは,4月の花見以来会ってなかったので,3ヶ月ぶり.
今年も面白い後輩が沢山いるみたい.夏合宿が楽しみだ.
「ハッカーと画家」を読んだ.
「Lisp最高,Microsoft最悪」な著者が,一流のハッカーについて(と近づく方法)全16章で語っている.
独特の語り調が面白くて,一気に読む事ができた.
この作品の特徴は,読者の創作意欲を一気に引き出す点だと思う.
大学のプログラミングのカリキュラムでは,C言語の文法に半年もかけるよりは,この本を読ませ
「さぁ何か作ってみない? 分からない点があれば自分で調べて.」と言った方が効果的な気がする.
素質のある人は,それで勝手に動き出すと思う.
ちなみに,この本はWeb上で全編公開されています.というよりは,Web上のエッセイを本にまとめた物です.
私も,過去に何章分か読んだ事があったのでびっくりした.面白いので,興味のある方はぜひ読んでみてください.
日本語訳は「プロジェクト杉田玄白」(うちのリンク集にありますね^^;)上で公開されています.
ここを辿っていけば,見つける事ができるはずです.グレアム、ポールで探せば見つかるはず.(それぞれの章が別のテキストとして公開されています.)
で,「ハッカーと画家」に影響されてbsfilterというSPAMフィルタを入れてみる事にした.
POP proxyとしても動作させれるので,Windowsのクライアント側でも使える.
少し使ってみたけれど,良い感じに動作している.
ACM/ICPCの国内予選はなんとか通過しました.
35位=>重複を除くと21位でした.上位を狙う事も不可能で無い事は確認できたので,アジア予選はもっと上位を狙います.