[英]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 ()
,這意味着兩個約束:
<-
語句)必須具有某個a
類型IO a
a
。 do
-block中的最后一個語句必須具有類型IO ()
; 你的最終語句有[String]
類型(因此你得到的錯誤)。 該類型的最簡單語句是return ()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.