我使用以下代码收到错误:
main = do
putStrLn "Enter parameter"
parameter <- getLine
if head parameter == "c" then
let object = getObject parameter
print object
else
putStrLn "Error, try again"
main
我得到的错误是:
parse error on input `print'
尝试打印对象时。如果我试着打印函数的值而不保存它让它工作正常,但我需要保存该对象供以后使用。
语法应如何使其有效?
同样在&#34; else&#34;部分我得到以下错误:
The function `putStrLn' is applied to two arguments,
but its type `String -> IO ()' has only one
In the expression: putStrLn "Error" main
它认为我尝试将main作为putStrLn的参数运行,但我真正想要做的是首先显示错误然后再次运行main。我怎样才能解决这个问题?
提前致谢!
答案 0 :(得分:3)
您的代码存在一些问题。
首先,有解析错误。有两种方法可以解决这个问题。一个是使用let .. in block,就像@Lee指出的那样。
let object = getObject parameter
in print object
或者,我们可以在else子句中启动另一个do块:
then do
let object = getObject parameter
print object
其次,您将字符串的头部与另一个字符串进行比较:
head parameter == "c"
getLine返回一个字符串,因此字符串的头部是一个字符。我们可以将其更改为
head parameter == 'c'
最后,你试图在一个块中做两个语句,类似于之前的else子句:
else
putStrLn "Error, try again"
main
如果要将多个语句链接在一起,我们必须像以前一样使用do块:
else do
putStrLn "Error, try again"
main
全部放在一起:
main = do
putStrLn "Enter parameter"
parameter <- getLine
if head parameter == 'c' then do
let object = getObject parameter
print object
else do
putStrLn "Error, try again"
main