如果在haskell中的一个do符号内阻塞如何使用

时间:2017-11-16 11:44:55

标签: haskell if-statement let

我使用以下代码收到错误:

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。我怎样才能解决这个问题?

提前致谢!

1 个答案:

答案 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