Concurrent Clean : 8queen

そういえば、8queenって、まともに解いたことがなかったのではないかと思った。
で、解いてみた。

Start = show $ queens 8

show (n,as) = (show as,as)
  where
    show [] = "\n"
    show [a:ar] = "\n" +++ fill n a +++ show ar
      where
        fill n 0 = "*" +++ fill (n-1) -1
        fill 0 _ = ""
        fill n a = " " +++ fill (n-1) (a-1)

queens n = (n, hd $ next n [])
  where
    alive _ [] _                   = True
    alive d [q:qr] p
        | p == q || abs(p-q) == d  = False
                                   = alive (d+1) qr p

    next 0 qs = [qs]
    next m qs = foldr (++) []
                  $ map (next (m-1))
                  $ map (\x = [x:qs])
                  $ filter (alive 1 qs) [0..n-1]

途中、mとnを取り違えてはまった。