【发布时间】:2013-01-21 00:05:59
【问题描述】:
我对 Haskell 比较陌生,目前正在使用 LearnYouAHaskell。 我正在尝试获取一个由空格分隔的字符串,并将其分解为一个较小的字符串列表。 我目前的计划:
main = do
putStrLn "Insert a string to convert: "
-- Input string
line <- getLine
words line;
但在这种情况下,它告诉我我遇到了 IO 错误。 据我了解,getLine 是一个动作,所以由于这是不纯的,我必须将它绑定到“line”。 Line 是 getLine 的准确表示,它是一个 IO String。
但是,line 不应该是字符串吗? 当我尝试在线使用单词时,它告诉我 “无法将预期类型“IO a0”与实际类型 [String] 匹配
好像 line 不是字符串。 此外,我可以在程序本身中使用 :t 行来查看它是否是正确的类型吗?
我为这个新手问题道歉,但我有点卡住了。
编辑:
我在 GHCI 中做了类似的事情,它告诉我我的类型实际上是一个普通的字符串。我不明白。
Prelude> line <- getLine
"Hello fellows"
Prelude> :t line
line :: String
Prelude> words line
["Hello","fellows"]
为什么这不起作用?
【问题讨论】:
-
错误解释:
words line的类型为[String],但对于某些类型a0,do 块中的所有语句都应具有类型IO a0。