history

青木日記 RSS

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

2003-02-19

Monad

うーん、8 時間悩んだあげく Monad はなんとなくわかってきた。 ようするに「次の世界ジェネレータ」みたいなもんか。 Y コンビネータをやっておいたのがよかったな。 あれの連想でなんとなくわかる。 あっちは関数を連続生成してたのに対して、 こっちはプログラム実行環境を連続生成してるわけだ。

ただ、現実的にそれを外す方法がわかんないんだよー! IO から読むと全部「IO x」の型になってるから、 普通の関数が全く適用できない。なんとか IO を外したいんだけどなあ。

半死

ああ、もうだめだ。とりあえず fileutils に移ろうっと。

……ぐおおっ、楽! 楽すぎ! きゃー!

Monad

あれ? いや待てよー。これはもしかして……むむむむ?

ていうか「もうやめる」と言ったような気がするんだが。

12 時間経過して脳がスパークしてきた。

Monad (3)

ん? return すればいいのか? あー違う。これは a -> m a だから反対だ。

sequence?

だめだ。わからん。まぢでわかんない。

Haskell tail

ででででで、できたーーー! 12 時間もかかってしまった……。

http://i.loveruby.net/ja/haskell/tail.hs

module Main where
 
import System
import IO
 
main :: IO ()
main =
    do args <- getArgs
       case args of
         []   -> doTailFile stdin
         args -> mapM_ (\a -> do f <- openFile a ReadMode
                                 doTailFile f
                                 hClose f) args
 
doTailFile :: Handle -> IO ()
doTailFile f =
    do all <- hGetContents f
       rows <- return (lines all)
       mapM_ (\line -> putStrLn line) (tailFile rows (replicate 10 ""))
 
tailFile :: [String] -> [String] -> [String]
tailFile []     buf = buf
tailFile (x:xs) buf = tailFile xs (concat [(tail buf),[x]])

10 行以下のファイルを tail すると空行で埋められちゃうんだけど、 そこは勘弁してくだせい。あいかわらず端末が stdin だとうまく動かない。

さ、これでスッキリしたから朝ごはん食べて、 今度こそ fileutils と setup.rb をいじるかな。

あさごはん?

14 時だけどね。

Haskell 補足

あ、ちなみにさっきの「IO が付くからどーたらこーたら」ってのは 勘違いですね。do と <- を使って束縛すればあとは普通に処理できるみたい。

アレ

アレ→ λ

ですけど。「ミギーに似てる」っていうのは有名な話なんですか?

本日のツッコミ(全5件) [ツッコミを入れる]
tosh (2003-02-19 13:25)

(???) IO ??????????????????????????

tosh (2003-02-19 13:27)

すいません、失敗しました。
たぶん IO は外せません。外せたら実行順序が保てなくなるはずです。

あおき (2003-02-19 14:08)

ああ、やっぱりそうなんですね。なんか変だなーとは思ったんですが。
しかし、一回 IO が付いたら二度と外れないってことは、
ずーっとひきずってまわらないといけないのか。

nobsun (2003-02-20 11:33)

一度でもこの世ならぬものを覗いたらずっとそれをひきずるのが
掟なのだ。だが、とっておきの呪文をさずけよう。

unsafePerformIO :: IO a -> a

ただし、これをつかったことを純粋Functioalistに知られてはならぬ。もし、知られてしまったら。。。あなおそろしや

nobsun (2003-02-20 23:27)

ghc --make tail.lhs -o hstail
とかして、コンパイルしてバイナリ hstail をつくれば、標準入力もうまく動作するかも。
runhugsではうまく動作しませんねぇ。知らんかった。^^;

名前
メールアドレス

<前の日 | この月 | 次の日>
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