import Control.Monad import System.Random getPi throws = do results <- replicateM throws one_trial return (4 * fromIntegral (sum results) / fromIntegral throws) where one_trial = do rand_x <- randomRIO (-1, 1) rand_y <- randomRIO (-1, 1) let dist :: Double dist = sqrt (rand_x * rand_x + rand_y * rand_y) return (if dist < 1 then 1 else 0)