monad-par-0.1: examples/queens.hs
{-# LANGUAGE BangPatterns #-}
import System.Environment
import Control.Monad
import Control.Seq
import Control.Monad.Par
-- import Control.Monad.Par_Strawman
nqueens :: Int -> Par [[Int]]
nqueens nq = step 0 []
where
threshold = 5
step :: Int -> [Int] -> Par [[Int]]
step !n b
| n >= threshold = return (iterate gen [b] !! (nq - n))
| otherwise = do
rs <- parMapM (step (n+1)) (gen [b])
return (concat rs)
safe :: Int -> Int -> [Int] -> Bool
safe x d [] = True
safe x d (q:l) = x /= q && x /= q+d && x /= q-d && safe x (d+1) l
gen :: [[Int]] -> [[Int]]
gen bs = [ (q:b) | b <- bs, q <- [1..nq], safe q 1 b ]
main = do
args <- fmap (fmap read) getArgs
let n = case args of [] -> 8; [n] -> n
print (length (runPar (nqueens n)))