fork download
  1. import Data.Maybe
  2. import Data.Char
  3. import Data.List
  4. import Data.String.Utils
  5. import Control.Applicative
  6.  
  7. data Piece = King | Queen | Rook | Bishop | Knight | Pawn deriving(Eq,Enum,Show)
  8. data Actor = Black Piece | White Piece deriving(Eq)
  9. type Field = Maybe Actor
  10.  
  11. newtype Board = Board [Field]
  12.  
  13. instance Show Actor where
  14. show (Black piece) = fmap toUpper $ show piece
  15. show (White piece) = fmap toLower $ show piece
  16.  
  17. instance Show Board where
  18. show (Board fields) = all $ split fields
  19. where
  20. all = join "\n" . fmap rank . reverse
  21. rank = join "\t" . fmap (maybe "." show)
  22. split [] = []
  23. split fields = let (r,o)=splitAt 8 fields in r:split o
  24.  
  25. fenPiece :: Char -> Maybe Piece
  26. readFEN :: [Char] -> [Field]
  27.  
  28. fenPiece 'r' = Just Rook
  29. fenPiece 'b' = Just Bishop
  30. fenPiece 'n' = Just Knight
  31. fenPiece 'q' = Just Queen
  32. fenPiece 'k' = Just King
  33. fenPiece 'p' = Just Pawn
  34. fenPiece _ = Nothing
  35.  
  36. readFEN [] = []
  37. readFEN ('/':nextrank) = readFEN nextrank
  38. readFEN (piece:remain)
  39. | piece `elem` "rbnqkp" = (White <$> fenPiece piece) : readFEN remain
  40. | piece `elem` "RBNQKP" = (Black <$> fenPiece (toLower piece)) : readFEN remain
  41. | piece `elem` ['1'..'8'] = (replicate (read [piece]) $ Nothing) ++ readFEN remain
  42. | otherwise = readFEN remain
  43.  
  44. main = do
  45. putStrLn.show.Board $ readFEN "4r3/pp4k1/7p/n1p1p1p1/NbPpP2n/1P1P1r2/P1QB4/R4RK1"
  46.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.hs:4:8:
    Could not find module `Data.String.Utils'
    Use -v to see a list of the files searched for.
stdout
Standard output is empty