簡體   English   中英

使用單詞的字符串列表的Haskell字符串

[英]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.

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