関数の遅延評価について
>
>純粋関数型言語雑記帳の記事
>
を見て、二度ほどトンチンカンなツッコミをしてしまったので改めて。 > >僕がツッコミを入れた問題は、 > >do h <- openFile "hoge" ReadMode
dat <- hGetContents h
hClose dat
let newdat = process dat
writeFile "hoge" newdat > >というような場合には、遅延評価の関係で openFile -> hClose -> hGetContents の順に評価が行われてしまい、 hGetContents の中身が空になるということ。ツッコミを入れたあとでいろいろやってようやく考えついたのがこれ。 > >do h <- openFile "hoge" ReadMode
dat <- hGetContents h
return $! dat
hClose dat
writeFile "hoge" (process dat) > >doの途中に return があるのがキモいが、とにかくまぁこれなら動くといえば動く。また、入力を文字列として扱いたくない場合には > >do h <- openFile "hoge" ReadMode
dat <- hGetContents h
newdata <- return $! process $ read dat
hClose dat
writeFile "hoge" (show newdata) > >で上手く行く……のかな?(こっちは試していない) > >追記: てか最後のやつがそれで良いならば、別に途中に return な行を設けなくても newdata <- return $! process dat で良いはずだな。 >
を見て、二度ほどトンチンカンなツッコミをしてしまったので改めて。 > >僕がツッコミを入れた問題は、 > >do h <- openFile "hoge" ReadMode
dat <- hGetContents h
hClose dat
let newdat = process dat
writeFile "hoge" newdat > >というような場合には、遅延評価の関係で openFile -> hClose -> hGetContents の順に評価が行われてしまい、 hGetContents の中身が空になるということ。ツッコミを入れたあとでいろいろやってようやく考えついたのがこれ。 > >do h <- openFile "hoge" ReadMode
dat <- hGetContents h
return $! dat
hClose dat
writeFile "hoge" (process dat) > >doの途中に return があるのがキモいが、とにかくまぁこれなら動くといえば動く。また、入力を文字列として扱いたくない場合には > >do h <- openFile "hoge" ReadMode
dat <- hGetContents h
newdata <- return $! process $ read dat
hClose dat
writeFile "hoge" (show newdata) > >で上手く行く……のかな?(こっちは試していない) > >追記: てか最後のやつがそれで良いならば、別に途中に return な行を設けなくても newdata <- return $! process dat で良いはずだな。 >
