我正在这里进行练习http://book.realworldhaskell.org/read/functional-programming.html。我需要转置文本文件的问题的解决方案似乎占用了大量的CPU时间。如果可以的话,我怎样才能改进以下算法,以减少CPU的负担。
import System.Environment (getArgs)
import Data.Char(isAlpha)
interactWith function inputFile outputFile = do
input <- readFile inputFile
writeFile outputFile (function input)
main = mainWith myFunction
where mainWith function = do
args <- getArgs
case args of
[input,output] -> interactWith function input output
_ -> putStrLn "error: exactly two arguments needed"
-- replace "id" with the name of our function below
myFunction = transpose
transpose :: String -> String
transpose input = tpose (lines input)
tpose [] = []
tpose xs = concat (map (take 1) xs) ++ "\n" ++ tpose (map (drop 1) xs)
答案 0 :(得分:2)
跳到第8章,其中讨论了String数据类型的低效性,并建议使用ByteString。如果您的文件是unicode,还有Data.Text。
答案 1 :(得分:1)
Data.List
模块包含一些有用的功能,例如transpose :: [[a]] -> [[a]]
。 lines
中还有unlines
和Prelude
,它们在String
和[String]
之间进行转换(通过打破换行符)。
所以基本上,你可能想要像
这样的东西main = do
[input,output] <- getArgs
interactWith (unlines . transpose . lines) input output