String 用Haskell阅读行和反转文本

String 用Haskell阅读行和反转文本,string,haskell,text,io,functional-programming,String,Haskell,Text,Io,Functional Programming,我的程序应执行以下操作: 从文件中读取行 对于每一行,颠倒每个单词的文本(“蝙蝠猫帽”变成“tab tac tah”) 打印出相反的文本 但是它不起作用,作为一个哈斯克尔的新手,我不理解其中的错误 这是我的密码: main = do content <- readFile "test.txt" let linesList = lines content reverseLines reverseWords :: String -> String rever

我的程序应执行以下操作:

  • 从文件中读取行
  • 对于每一行,颠倒每个单词的文本(“蝙蝠猫帽”变成“tab tac tah”)
  • 打印出相反的文本
但是它不起作用,作为一个哈斯克尔的新手,我不理解其中的错误

这是我的密码:

main = do
    content <- readFile "test.txt"
    let linesList = lines content
    reverseLines

reverseWords :: String -> String
reverseWords = unwords . map reverse . words

reverseLines :: [String] -> IO ()
reverseLines inputList = do
    if null inputList
        then return ()
        else do
        line <- inputList!!0
        if null line
            then return ()
            else do
                putStrLn $ reverseWords line
                reverseLines . tail inputList
main=do
内容字符串
reverseWords=unwords。地图倒过来。话
反向线::[String]->IO()
反向线输入列表=do
如果输入列表为null
然后返回()
否则会
行IO()'
在“do”块的stmt中:反向线
在表达式中:

执行{content首先,
main
函数中的最后一行是[String]->IO()类型,您需要它是IO(),因此您实际上需要将字符串列表传递给它。下面是一种执行请求的方法:

main :: IO ()
main = do
    content <- readFile "test.txt"
    let linesList = lines content
    reverseLines linesList

reverseWords :: String -> String
reverseWords = unwords . map reverse . words

reverseLines :: [String] -> IO ()
reverseLines = mapM_ (putStrLn . reverseWords)
我也修改了你的版本,只做了很少的修改,但请记住,这并不是Haskell真正的方法

main = do
    content <- readFile "test.txt"
    let linesList = lines content
    reverseLines linesList

reverseWords :: String -> String
reverseWords = unwords . map reverse . words

reverseLines :: [String] -> IO ()
reverseLines inputList = do
    if null inputList
        then return ()
    else do
      let line = head inputList 
      if null line
          then return ()
          else do
              putStrLn $ reverseWords line
              reverseLines $ tail inputList
main=do
内容字符串
reverseWords=unwords.map reverse.words
反向线::[String]->IO()
反向线输入列表=do
如果输入列表为null
然后返回()
否则会
let line=头输入列表
如果为空行
然后返回()
否则会
putStrLn$reverseWords行
反向线$tail输入列表

当您看到一条新的错误消息时,首先应该仔细阅读它,如果您不能理解它的含义,请执行以下操作。
reverseLines2 :: [String] -> IO ()
reverseLines2 []      = return ()
reverseLines2 (x:xs)  = do
  putStrLn (reverseWords x)
  reverseLines2 xs
main = do
    content <- readFile "test.txt"
    let linesList = lines content
    reverseLines linesList

reverseWords :: String -> String
reverseWords = unwords . map reverse . words

reverseLines :: [String] -> IO ()
reverseLines inputList = do
    if null inputList
        then return ()
    else do
      let line = head inputList 
      if null line
          then return ()
          else do
              putStrLn $ reverseWords line
              reverseLines $ tail inputList