如何在 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