在Haskell中转置文本文件

时间:2012-03-22 04:30:37

标签: functional-programming haskell

我正在这里进行练习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)

2 个答案:

答案 0 :(得分:2)

跳到第8章,其中讨论了String数据类型的低效性,并建议使用ByteString。如果您的文件是unicode,还有Data.Text。

答案 1 :(得分:1)

Data.List模块包含一些有用的功能,例如transpose :: [[a]] -> [[a]]lines中还有unlinesPrelude,它们在String[String]之间进行转换(通过打破换行符)。

所以基本上,你可能想要像

这样的东西
main = do
  [input,output] <- getArgs
  interactWith (unlines . transpose . lines) input output