我有一个读取单词的函数,将第一个和最后一个字母分开,剩下的内容混合在一起,最后写出单词的第一个和最后一个字母,但是混合内容。
实施例: 您好 - > H lle o
但是我希望你能够阅读一个短语并在句子的每个单词中做同样的事情。我能做什么?
import Data.List
import System.IO
import System.Random
import System.IO.Unsafe
import Data.Array.IO
import Control.Monad
import Data.Array
oracion = do
frase <- getLine
let pL = head frase
let contentR = devContent frase
charDisorder <- aleatorio contentR
let uL = last frase
putStrLn $ [pL] ++ charDisorder ++ [uL]
aleatorio :: [d] -> IO [d]
aleatorio xs = do
ar <- newArray n xs
forM [1..n] $ \i -> do
t <- randomRIO (i,n)
vi <- readArray ar i
vt <- readArray ar t
writeArray ar t vi
return vt
where
n = length xs
newArray :: Int -> [d] -> IO (IOArray Int d)
newArray n xs = newListArray (1,n) xs
devContent :: [Char] -> [Char]
devContent x = init (drop 1 x)
答案 0 :(得分:2)
那应该是这样的:
doStuffOnSentence sentence = mapM aleatorio (words sentence)
每当你处理monad(特别是IO)时,mapM
都是真正的救星。
更重要的是,如果你想连接最终结果你可以添加:
concatIoStrings = liftM unwords
doStuffAndConcat = concatIoStrings . doStuffOnSentence