Noc*_*Noc 2 string haskell list cpu-word
我对Haskell很新,我现在正在使用LearnYouAHaskell.我试图将一个由空格分隔的字符串,并将其分解为一个较小的字符串列表.我目前的计划:
main = do
putStrLn "Insert a string to convert: "
-- Input string
line <- getLine
words line;
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,它告诉我我有一个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"]
Run Code Online (Sandbox Code Playgroud)
为什么不起作用?
在haskell中,如果你想返回一个值,你必须这样说:
main = do
putStrLn "Insert a string to convert: "
-- Input string
line <- getLine
return (words line)
Run Code Online (Sandbox Code Playgroud)
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))
Run Code Online (Sandbox Code Playgroud)
虽然我个人把最后一行写成了putStrLn $ process.words $ line.
您在GHCi中的互动
Prelude> line <- getLine
"Hello fellows"
Prelude> :t line
line :: String
Prelude> words line
["Hello","fellows"]
Run Code Online (Sandbox Code Playgroud)
使用的事实是GHCi实际上并不只是在IO monad中运行.在GHCi中,如果你的输入是一个do块中的有效行,它将被运行,但如果它是纯代码,它将被评估和打印.(像这样的交互式解释器通常称为Read-Eval-Print-Loop的REPL.)
| 归档时间: |
|
| 查看次数: |
5218 次 |
| 最近记录: |