Haskell Quiz/Text Munger/Solution Dolio

From HaskellWiki
Jump to navigation Jump to search


This solution makes use of the random monad elsewhere on the wiki.

module Main where
import Control.Monad
import Data.Char
import Data.List
import System.Random
import MonadRandom

permute [] = return []
permute l  = do r <- getRandomR (0, n)
                let (a, e:b) = splitAt r l
                l' <- permute (a ++ b)
                return $ e : l'
 where n = length l - 1

munge l
    | isAlpha h && length l > 2 = ((h:) . (++[f])) `liftM` permute m
    | otherwise                 = return l
 where h = head l
       f = last l
       m = tail (init l)

main = do g <- getStdGen
          interact $ flip evalRand g . liftM join . mapM munge . groupBy f
 where f a b = isAlpha a == isAlpha b