簡體   English   中英

使用Haskell將字符串拆分為列表

[英]Split strings into lists with Haskell

回到故事 :我上周一直在努力解決這個問題,通過在線閱讀Learn You A Haskell和教程,但我無法理解。

我在理解列表理解和遞歸方面取得了很大的進步,但是這個問題仍然存在於我的方向。

問題 :我正在嘗試將String(或我認為是String)轉換為分割列表。 這是我到目前為止的代碼(再次感謝Jan的幫助)。 它導入.txt文件的內容。

import System.Environment

main :: IO ()
main = do
     args <- getArgs
     if null args
       then putStrLn "usage: ./pattern dataset.txt"
       else do contents <- readFile $ head args
               putStrLn $ "Filer1: " ++ filterLower(contents)
               convert' contents

filterLower :: String -> String
filterLower st = [ c | c <- st, c `elem` ['A'..'Z']]

我嘗試制作自己的轉換功能:

convert' :: String -> [String]
convert' x = (x:[])

它可以工作,但它不適用於這個問題。

任何幫助,將不勝感激。

錯誤 :這是我經常收到的錯誤。

Couldn't match expected type `IO ()' with actual type `[String]'
    In the return type of a call of `convert''
    In the expression: convert' contents
    In the expression:
      do { contents <- readFile $ head args;
             putStrLn $ "-: " ++ filterLower contents;
           convert' contents }

問題是convert'的結果是一個字符串列表,但你試圖將它用作IO動作。 你必須對結果做點什么。 例如,

print $ convert' contents

會將結果打印到屏幕上。 或者您可以使用例如mapM_ putStrLn在自己的行上打印每個元素。 或者你可以給它一個名字,並繼續寫下聲明,如:

let converted = convert' contents
...

通過你的評論,似乎你試圖划分字符串的方式是把它變成一個單詞列表,例如convert' "Hello world"["Hello", "world"] 在這種情況下,您根本不需要convert' - 標准words功能就是這樣! 所以你可以只使用words contents而不是定義convert'

convert' :: String -> [String] ,所以convert' contents :: [String]只是一個字符串列表。 但是你把它放在IO塊中,

do contents <- readFile whatever
   putStrLn $ ...
   convert' contents

只有IO something類型的表達式才能出現。 有一種簡單的方法可以將無IO表達式轉換為IO,只需return它:

do contents <- readFile ...
   putStrLn $ ...
   return $ convert' contents

輸入正確。 但是這個do-block的類型為IO [String] ,因此它與main的聲明類型不匹配。 如何解決這個問題取決於你希望你的程序做什么。

我不明白你在這里要做什么,但最大的問題是你沒有正確使用do -block。 main具有類型IO () ,這意味着兩個約束:

  • do-block中的每個“bare”語句(不帶<-語句)必須具有某個a類型IO a a
  • do -block中的最后一個語句必須具有類型IO () ; 你的最終語句有[String]類型(因此你得到的錯誤)。 該類型的最簡單語句是return ()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM