Probability Monad (あきらめ)

今日はまじめに論文を読んでて疲れたので、気分転換に昔どっかでみた"確率モナド"みたいなものを実装してみようと思った。けどめんどくさくなったのでモナドにするのはあきらめて、 select という関数を作って代用してみた。まぁ、それなりにそれっぽく書けるようである。

import System.Random (randomRIO)
import Data.List (sort, group)

select list = do n <- randomRIO (0, length list - 1)
                 return $ list!!n
dice = select [1..6]
sumOf2Dices =
  do x <- dice
     y <- dice
     return $ x+y
simulate n =
  do x <- mapM (const sumOf2Dices) [1..n]
     return $ zip [2..12] $ map length $ group $ sort x
visualize x = mapM_ f x
    where
      f (a,b) = putStrLn $ show a ++ ": "++replicate b '*'
check x = simulate x >>= visualize
Main> check 300
2: ********
3: *************
4: *************************
5: *****************************
6: ****************************************
7: ****************************************************
8: **********************************************
9: *********************************
10: *************************
11: *****************
12: ************
Main>