[英]Haskell String to List of Strings using Words
我對Haskell很新,我現在正在使用LearnYouAHaskell。 我試圖將一個由空格分隔的字符串,並將其分解為一個較小的字符串列表。 我目前的計划:
main = do
putStrLn "Insert a string to convert: "
-- Input string
line <- getLine
words line;
但在這種情況下,它告訴我我有一個IO錯誤。 根據我的理解,getLine是一個動作,因此,由於這是不純的,我必須將它綁定到“行”。 Line是getLine的精確表示,它是一個IO String。
但是,不應該成為一個字符串? 當我嘗試在線使用單詞時,它告訴我“無法匹配預期類型”IO a0“與實際類型[String]
好像line不是字符串。 此外,我可以在程序中使用:t行,當我查看它是否是正確類型的實際?
我為新手問題道歉,但我有點卡住了。
編輯:
我在GHCI做了類似的事情,它告訴我我的類型實際上是一個普通的字符串..我不明白。
Prelude> line <- getLine
"Hello fellows"
Prelude> :t line
line :: String
Prelude> words line
["Hello","fellows"]
為什么不起作用?
在haskell中,如果你想返回一個值,你必須這樣說:
main = do
putStrLn "Insert a string to convert: "
-- Input string
line <- getLine
return (words line)
words line
不是IO動作,它是一個字符串列表,因此它不能是do
塊中的語句。
return :: Monad m => a -> ma
,在這種情況下,我們可以將它專門化為類型a -> IO a
然后再調整到[String] -> IO [String]
。 do
塊中的每個語句do
必須是IO
語句。
進一步說:
如果你想編譯你的程序,你應該有main :: IO()
,這意味着你不應該返回你的列表。
如果,例如,你想process
這些字符串連接成一個字符串,然后輸出,你可以做
process :: [String] -> String
process xss = "I don't know, some answer"
main = do
putStrLn "Insert a string to convert: "
-- Input string
line <- getLine
putStrLn (process (words line))
雖然我親自把最后一行寫成putStrLn $ process.words $ line
。
您在GHCi中的互動
Prelude> line <- getLine
"Hello fellows"
Prelude> :t line
line :: String
Prelude> words line
["Hello","fellows"]
使用的事實是GHCi實際上並不只是在IO monad中運行。 在GHCi中,如果你的輸入是do
塊中的有效行,它將被運行,但如果它是純代碼,它將被評估和打印。 (像這樣的交互式解釋器通常稱為Read-Eval-Print-Loop的REPL。)
好吧,問題是你想用words line
做什么?
在do塊中將words line
作為一行無效,但要使其工作,您必須使用return
將其包裝在IO monad中:
main = do
putStrLn "Insert a string to convert: "
-- Input string
line <- getLine
return (words line);
無論如何,也許你想要打印它?
main = do
putStrLn "Insert a string to convert: "
-- Input string
line <- getLine
print (words line);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.