module 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'