Haskellでマーシャリング(showとread)

30分プログラム、その413。Haskellでマーシャリングにチャレンジしようとして、showとreadで十分なことに気がついた。
でも、せっかくなので途中の状態を保存して、中断可能な関数を書いてみた。たぶん、id:Gemmaさんあたりに継続使おうぜ、とか言われるんだろうなぁ。

使い方

$ ./marshal
fact:10000
fact:9999
fact:9998
fact:9997
fact:9996
^C

$ cat dump
(0,8934)

$ ./marshal
fact:9995
fact:9994
fact:9993
...

ソースコード

import System.Directory

fact :: Int -> Int -> IO Int
fact m 0 = return m
fact m n = do putStrLn $ "fact:" ++ show n
              writeFile "dump" $ show (m,n)
              fact (m*n) (n-1)

resume :: IO Int
resume = do (m,n) <- readFile "dump" >>= return . read
            fact m n

main = do exist <- doesFileExist "dump" 
          if exist 
            then resume >>= print
            else fact 1 10000 >>= print