rendered paste bodymodule Main where
import Control.Arrow (first)
import Control.Monad (liftM)
import Data.List (sort)
import Random (randomRIO)
main :: IO ()
main = do
(picked, rest) <- picks 7 [0..39]
print (sort picked)
pick :: [a] -> IO (a, [a])
pick [] = undefined
pick xs = do
ix <- randomRIO (0, length xs - 1)
let (hs, x:ts) = splitAt ix xs
return (x, hs ++ ts)
picks :: Integral i => i -> [a] -> IO ([a], [a])
picks 0 xs = return ([], xs)
picks n xs = do
(p, xs') <- pick xs
first (p :) `liftM` picks (n-1) xs'