如何在 haskell 中的 do 符号内使用 let inside if 块
How to use let inside if block inside a do notation in haskell
我收到以下代码的错误:
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'
尝试打印对象时。如果我改为尝试打印函数的值而不用 let 保存它,它就可以正常工作,但我需要保存该对象以供以后使用。
语法应该怎样才能让它发挥作用?
同样在 "else" 部分我得到以下错误:
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。我怎样才能解决这个问题?
提前致谢!
您的代码存在一些问题。
首先是解析错误。有两种方法可以解决这个问题。一种是使用 let .. in 块,正如@Lee 指出的那样。
let object = getObject parameter
in print object
或者,我们可以在 else 子句中开始另一个 do 块:
then do
let object = getObject parameter
print object
其次,您将一个字符串的头部与另一个字符串进行比较:
head parameter == "c"
getLine returns一个字符串,所以字符串的头部是一个字符。我们可以将其更改为
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
我收到以下代码的错误:
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'
尝试打印对象时。如果我改为尝试打印函数的值而不用 let 保存它,它就可以正常工作,但我需要保存该对象以供以后使用。
语法应该怎样才能让它发挥作用?
同样在 "else" 部分我得到以下错误:
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。我怎样才能解决这个问题?
提前致谢!
您的代码存在一些问题。
首先是解析错误。有两种方法可以解决这个问题。一种是使用 let .. in 块,正如@Lee 指出的那样。
let object = getObject parameter
in print object
或者,我们可以在 else 子句中开始另一个 do 块:
then do
let object = getObject parameter
print object
其次,您将一个字符串的头部与另一个字符串进行比较:
head parameter == "c"
getLine returns一个字符串,所以字符串的头部是一个字符。我们可以将其更改为
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