Advertisement
Guest User

Untitled

a guest
Apr 24th, 2014
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import System.Random
  2. import Control.Monad(when)  
  3. import Control.Monad.State.Lazy
  4.  
  5. consonants :: [Char]
  6. consonants = "bcdfghjklmnpqrstvwxyz"
  7.  
  8. vowels :: [Char]
  9. vowels = "aeiou"
  10.  
  11. randomInt :: (Int, Int) -> State StdGen Int
  12. randomInt bounds = do
  13.     gen <- get
  14.     let (result, newGen) = randomR bounds gen
  15.     put newGen
  16.     return result
  17.  
  18. random2 :: Int -> State StdGen Int
  19. random2 n = randomInt (0, n - 1)
  20.  
  21. randomChoose :: [a] -> State StdGen a
  22. randomChoose l = do
  23.     index <- random2 $ length l
  24.     return $ l !! index
  25.  
  26. randomConsonant :: State StdGen Char
  27. randomConsonant = randomChoose consonants
  28.  
  29. randomVowel :: State StdGen Char
  30. randomVowel = randomChoose vowels
  31.  
  32. randomReplicate :: (Int, Int) -> a -> State StdGen [a]
  33. randomReplicate bounds x = do
  34.     n <- randomInt bounds
  35.     return $ replicate n x
  36.  
  37. main = do
  38.     seed <- randomIO
  39.     let str = fst $ runState genSyllable $ mkStdGen seed
  40.     putStrLn $ "Syllable is " ++ str
  41.  
  42. genSyllable :: State StdGen String
  43. genSyllable = do
  44.    beg <- randomReplicate (0, 3) randomConsonant
  45.    mid <- randomReplicate (1, 2) randomVowel
  46.    end <- randomReplicate (0, 3) randomConsonant
  47.    let all = concat [beg, mid, end]
  48.    sequence all
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement