如何阅读一个句子,将单词分开并将我的功能应用到每个单词?哈斯克尔

时间:2018-05-28 16:21:57

标签: haskell

我有一个读取单词的函数,将第一个和最后一个字母分开,剩下的内容混合在一起,最后写出单词的第一个和最后一个字母,但是混合内容。

实施例:  您好 - > 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)

1 个答案:

答案 0 :(得分:2)

那应该是这样的:

doStuffOnSentence sentence = mapM aleatorio (words sentence)

每当你处理monad(特别是IO)时,mapM都是真正的救星。

更重要的是,如果你想连接最终结果你可以添加:

concatIoStrings = liftM unwords
doStuffAndConcat = concatIoStrings . doStuffOnSentence