Data.IORefを使ってみよう

30分プログラム、その513。Haskellでmutableな変数が使えると評判のData.IORefを使ってみた。
で、いざ書き換え可能な変数があるとなると、なかなかいいサンプルが思いつかない。しょうがないので、フィボナッチ数で関数が何回呼び出されるかカウントするやつを作ってみた。
わりとStateモナドとの違いが分からない。

使い方

*Main> fibWithCount 10
(55,177)

ソースコード

import Data.IORef
incr ref = do modifyIORef ref (+1)

fib :: IORef Int -> Int -> IO Int
fib ref n = do incr ref
               if n <= 1 then return n
                         else do x <- fib ref (n-1)
                                 y <- fib ref (n-2)
                                 return $ x + y

fibWithCount n = do ref    <- newIORef 0
                    answer <- fib ref n
                    count  <- readIORef ref
                    return (answer,count)