history

青木日記 RSS

<前の日 | この月 | 次の日>

2003-02-17

"History of Lisp"

反応が遅れます。

とか言いつつ 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。なんでだろう。

Haskell on RWiki

RWiki に適当に書いておいた Haskell の疑問に答えが! どなたか存じませんがありがとうございます。

リファレンスとかは揃ってるんですね。量は多いですが、 ここからたどれるものを読んでいけば一通り理解できそうです。

しかしモナドとかはやっぱりどうも……。 きっと、なんでそういうものが必要なのかわからないとダメなんでしょうね。 んで、そういうことがわかるにはプログラムを書かなきゃいけないと。

本日のツッコミ(全5件) [ツッコミを入れる]
とおりすがり (2003-02-17 23:15)

昔C++のSTLプログラミングが流行ってた頃、関数型言語を研究している先輩が「手続き型言語ではmapのことをイテレータと呼ぶのか〜。」と言っていたのを思い出しました。

Tosh (2003-02-18 00:13)

Monad はあくまで抽象化の手段としてあるのであって「必要」ではないんじゃないかと思います。IO使うならストリームとか他に手段はあるし。Haskell のチュートリアルとかには Monad の例は大抵 IO Monad になっているので Monad は非正格な言語で IO を扱うためのものだと誤解しがちだけど、そのためのものではないです。しかもIO Monadは特別わかりづらい (IO Monad の定義が Haskell 自身では書けないため) ので State Transformer Monad とかを例に見た方がよいと思います。 たぶん青木さんなら ST Monad をちょっと調べてから Monadic parser combinator とかを見るとかなり感動できるでしょう。

Tosh (2003-02-18 00:18)

あ、Toshは別にHaskell使いでもなんでもないので上のは鵜呑みにしないでください。

のりつぐ (2003-02-18 11:58)

有名な GC 本の題名 教えて下さい…(AmazonとかでTopに出る奴?)

kjana (2003-02-18 13:33)

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

名前
メールアドレス

<前の日 | この月 | 次の日>
2002|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|04|05|06|09|10|
2009|07|
2010|09|

Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved. LIRS