2013-02-05 83 views
2

我對Haskell相當新,而且我目前正在使用LearnYouAHaskell。 我正在嘗試使用由空格分隔的字符串,並將其分解爲一個較小的字符串列表。 我目前的計劃:Haskell字符串到使用字的字符串列表

main = do 
    putStrLn "Insert a string to convert: " 
    -- Input string 
    line <- getLine 
    words line; 

但在這種情況下,它告訴我,我有一個IO錯誤。 據我瞭解,getLine是一個動作,所以既然這是不純的,我必須將它綁定到「行」。 Line是getLine的精確表示,它是一個IO字符串。

但是,不應該是一個字符串? 當我嘗試使用上一行字,它告訴我 「無法匹配,期望型‘IO A0’與實際類型[字符串]

彷彿線是不是字符串。 此外,我可以使用:在程序本身牛逼線的時候我做它,看它是否實際正確類型的或不

我的新手問題道歉,但我有點卡住

編輯:?

我在GHCI做了類似的事情,它告訴我我的類型實際上是一個普通的字符串..我不會等等。

Prelude> line <- getLine 
"Hello fellows" 
Prelude> :t line 
line :: String 
Prelude> words line 
["Hello","fellows"] 

爲什麼不行?

+0

錯誤的解釋:'字行'的類型爲'[String]',但是do塊中的所有語句預計都會爲'a0'類型'IO a0'。 – hzap

回答

6

在Haskell,如果你想返回一個值,你必須這麼說:

main = do 
    putStrLn "Insert a string to convert: " 
    -- Input string 
    line <- getLine 
    return (words line) 

words line不是一個IO動作,這是一個字符串列表,所以它不能在聲明一個do塊。

return :: Monad m => a -> m a在這種情況下,我們可以將其專門化爲a -> IO a型,然後到[String] -> IO [String]。您的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單子運行。在GHCi中,如果您的輸入是do區塊中的有效行,它將會運行,但如果它是純代碼,則會被評估和打印。(像這樣的交互式解釋器通常被稱爲Read-Eval-Print-Loop的REPL。)

+0

謝謝你的簡潔解釋! – Noc

+0

@Noc不客氣。您是否看到GHCi信息的編輯?現在不太簡潔,但希望更有幫助。 – AndrewC

2

嗯,問題是你想用words line做什麼?

words line作爲DO塊內的線無所作爲,而是要得到它的工作,你必須使用return在IO單子把它包起來:

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); 
+0

好吧,最終的目的是製作一個豬拉丁轉換器 - 這是爲了家庭作業,但因爲這不是純粹與它有關的東西,所以我貼出來。我想獲得一個輸入字符串,使用words功能將字符串分解爲單個單詞。檢查它是否以元音開頭;做一個函數來檢查它。使用地圖和豬拉丁語功能,然後使用unwords將其重新轉換爲字符串。 – Noc

+3

那......在進一步閱讀後,我意識到我不知道Haskell做了什麼回報。我完全相信這個聲明:「你已經完成了像C,Java或Python這樣的命令式語言,你可能認爲你知道這個回報是什麼,你很可能已經跳過了這麼長的段落。事情:Haskell的回報真的不像大多數其他語言的回報!「 – Noc