Advertisement
Guest User

Untitled

a guest
Feb 27th, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.80 KB | None | 0 0
  1. module Main where
  2.  
  3. import System.Random
  4. import Control.Monad.State
  5.  
  6. type RandomMonad a = State StdGen a
  7.  
  8. randomRState :: Random a => (a, a) -> RandomMonad a
  9. randomRState rt = get >>= (\(a, g) -> put g >> return a) . randomR rt
  10.  
  11. randomBool :: RandomMonad Bool
  12. randomBool = randomRState (False,True)
  13.  
  14. unfoldM :: Monad m => (a -> m a) -> (a -> Bool) -> a -> m [a]
  15. unfoldM f s a = do
  16. v <- f a
  17. if s v
  18. then return []
  19. else liftM (v :) (unfoldM f s v)
  20.  
  21. whiteout :: Char -> RandomMonad Char
  22. whiteout c = do
  23. r <- randomBool
  24. if r
  25. then return c
  26. else return ' '
  27.  
  28. blank :: String -> Bool
  29. blank = all (== ' ')
  30.  
  31. disintegrate :: String -> RandomMonad [String]
  32. disintegrate = unfoldM (mapM whiteout) blank
  33.  
  34. main :: IO ()
  35. main = do
  36. r <- getStdGen
  37. i <- getLine
  38. mapM_ putStrLn $ evalState (disintegrate i) r
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement