反応が遅れます。
とか言いつつ Lisp の歴史に関する論文なんて読んでるし。 バカですかわたしは。
RHG 読書会で「Lisp には最初から GC があったわけじゃないだろう」という話が 出たので、それを調べようと思ったんですが、ちょと深入りしすぎました。 結論だけ言うと、アイデアはあったものの、Lisp 1 の実装には GC は 入っていなかったようです。
あああ、欲望のままに Haskell の本を注文してしまった……。がくり。 ついでに有名な GC 本も頼んだ。てゆーかまだ買ってなかったのかおまえは! (だって金がなかったんだもん)
あーもう、なんで知らないうちに Haskell echo とか Haskell cat とか 書き始めてんだよっ! つーか Haskell わかんねえ! ぜんっぜんわかんねえ! RWiki の RHG 読書会ページ経由で教えてもらった山下さんのページ↓を見ながら やってるんだけども、これは強烈にムズいわ。
んでもいきますよー。 とりあえず Hello, World! は基本ってことで。
module Main (main) where main :: IO () main = putStrLn "Hello, World!"
次に Haskell echo。
module Main where import System main :: IO () main = do { args <- getArgs ; mapM_ (\a -> putStrLn a) args }
このあたりで「args はいらないんじゃないかなー」と思い込んで 「<-」を消し、ハマる罠。getArgs が最初からリストを返すから、 それじゃだめなんですね……。ちなみに mapM_ の「M_」もまだ謎なんだけど。
んで三つめは Haskell cat。もう何がなんだかわからない。 屋下屋を架す、みたいな。元々ない知識を総動員してみました。
module Main where import System import IO main :: IO () main = do args <- getArgs case args of [] -> catFile stdin args -> mapM_ (\a -> do f <- openFile a ReadMode catFile f hClose f) args catFile :: Handle -> IO () catFile f = do eof <- hIsEOF f if eof then return () else do c <- hGetChar f hPutChar stdout c catFile f
特に catFile の型が何なのかさっぱりわからんかった。 省略すれば推測してくれるんだけど、なんか負けた気分になるし……。 しかしエラーメッセージが不親切でデバッグが非常にやりづらい。 Ruby みたくスタックトレースが出るのって楽だなあ、とつくづく思う。
あ、このへんで気付いたんだけど、Haskell って indent sensitive なのね。 インデント消すとエラーになる。しかもコーディングルールが謎。 特に else の位置がかなり気持ち悪い。 (ちなみに if よりネストを深くすれば次の行にも置けるようだ)
うーん、でもなんかわかってきたような気がする。 catFile ならファイルハンドルを無「()」のストリーム (IO) に変換するから 「IO ()」になるということだな。文字 (Char) のストリーム (IO) なら IO Char で、 行 (String) のストリーム (IO) なら IO String になるんだ。きっと。
ぐあ…… Haskell cat、端末が stdin だと Ctrl-D が効かない。
% cat file | ./cat.hs
だと OK。
% ./cat.hs aaaa ^D
だと NG。なんでだろう。
RWiki に適当に書いておいた Haskell の疑問に答えが! どなたか存じませんがありがとうございます。
リファレンスとかは揃ってるんですね。量は多いですが、 ここからたどれるものを読んでいけば一通り理解できそうです。
しかしモナドとかはやっぱりどうも……。 きっと、なんでそういうものが必要なのかわからないとダメなんでしょうね。 んで、そういうことがわかるにはプログラムを書かなきゃいけないと。
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.
昔C++のSTLプログラミングが流行ってた頃、関数型言語を研究している先輩が「手続き型言語ではmapのことをイテレータと呼ぶのか〜。」と言っていたのを思い出しました。
Monad はあくまで抽象化の手段としてあるのであって「必要」ではないんじゃないかと思います。IO使うならストリームとか他に手段はあるし。Haskell のチュートリアルとかには Monad の例は大抵 IO Monad になっているので Monad は非正格な言語で IO を扱うためのものだと誤解しがちだけど、そのためのものではないです。しかもIO Monadは特別わかりづらい (IO Monad の定義が Haskell 自身では書けないため) ので State Transformer Monad とかを例に見た方がよいと思います。 たぶん青木さんなら ST Monad をちょっと調べてから Monadic parser combinator とかを見るとかなり感動できるでしょう。
あ、Toshは別にHaskell使いでもなんでもないので上のは鵜呑みにしないでください。
有名な GC 本の題名 教えて下さい…(AmazonとかでTopに出る奴?)
The Haskell Bookshelf
http://haskell.org/bookshelf/
より....
A Gentle Introduction to Haskell
http://haskell.org/tutorial/
What the hell are Monads?
http://www.dcs.gla.ac.uk/~nww/Monad.html
とか読むとなんとなくわかった気になれます.で,後で
語ろうとすると全然わかってないのに気づく,と :-P