【问题标题】:Haskell parse error on input `let'Haskell在输入'let'上解析错误
【发布时间】:2014-02-26 18:56:53
【问题描述】:

我正在尝试运行此代码,但在输入“let”时出现解析错误:

 let database = tempFilm:database

我找不到问题出在哪里,你能看看吗?

options 7 (username, database) = do   putStrLn "******************"
                                      putStrLn "   Rate a film    "
                                      putStrLn "******************"
                                      putStrLn ""
                                      putStr "Enter the title of the film or nothing to return to the main menu: "
                                      title <- getLine
                                      if title == ""
                                        then return(username, database)
                                      else do let filmCheck = findFilm title database
                                              if filmCheck == []
                                                then do putStrLn "That film does not exists."
                                                        return (username, database) 
                                                else do putStr "Enter your rate: "
                                                        tempRate <- getLine
                                                        case reads tempRate :: [(Integer, String)] of
                                                             [(n, "")] -> do let rate = read tempRate :: Int
                                                                             let tempFilm = rateFilm username (username, rate) filmCheck
                                                                             if checkIfRated username tempFilm == True 
                                                                              then do putStrLn "You already voted for this film\n"
                                                                                      putStrLn "Do you want to modify your voted?\n"
                                                                                      putStrLn "Press y to modify or nothing to return to the main menu:"
                                                                                      input <- getLine
                                                                                      if input /= "y"
                                                                                        then return (username, database)
                                                                                      else putStrLn "Your vote will be modified."
                                                                             let database = tempFilm:database
                                                                             putStrLn "You rating has been  sumbited successfully!"
                                                                             putStrLn (displayFilm tempFilm)
                                                                             return (username, database) 

编辑: 何时使用

options 7 (username, database) = do   putStrLn "******************"
                                      putStrLn "   Rate a film    "
                                      putStrLn "******************"
                                      putStrLn ""
                                      putStr "Enter the title of the film or nothing to return to the main menu: "
                                      title <- getLine
                                      if title == ""
                                        then return(username, database)
                                      else do let filmCheck = findFilm title database
                                              if filmCheck == []
                                                then do putStrLn "That film does not exists."
                                                        return (username, database) 
                                                else do putStr "Enter your rate: "
                                                        tempRate <- getLine
                                                        case reads tempRate :: [(Integer, String)] of
                                                             [(n, "")] -> do let rate = read tempRate :: Int
                                                                             let tempFilm = rateFilm username (username, rate) filmCheck
                                                                             when (checkIfRated username tempFilm == True) $
                                                                                 do putStrLn "You already voted for this film\n"
                                                                                    putStrLn "Do you want to modify your vote?\n"
                                                                                    putStrLn "Press y to modify or nothing to return to the main menu:"
                                                                                    input <- getLine
                                                                                    if input /= "y"
                                                                                      then return (username, database)
                                                                                    else putStrLn "Your vote will be modified."
                                                                             let database = tempFilm:database
                                                                             putStrLn "You rating has been  sumbited successfully!"
                                                                             putStrLn (displayFilm tempFilm)
                                                                             return (username, database) 

我以前从未使用过的语法可能不正确

【问题讨论】:

    标签: haskell


    【解决方案1】:

    if checkIfRated ... then do putStrLn "you already voted"... 没有 else

    【讨论】:

    • 感谢您的回复亚伦。有没有办法写一个没有 else 的 if 语句?喜欢(如果 A 那么等等等等)
    • @user3207652:在 do-block 中,您可以使用 when,例如when cond $ do ...
    • @user3207652 你必须从Control.Monad导入它。
    • 谢谢大家解决了!
    【解决方案2】:

    if 关键字表示表达式的开头,该表达式具有三个组成部分:谓词(计算结果为 Bool 类型)、then 分支(计算结果为 say A)和 else 分支(也必须评估为类型 A)。 if if 表达式的类型是类型 A,任何有效的 Haskell 类型。

    我在此引用 Real World Haskell 一书的第 2 章,类型和函数,在 条件评估 下:

    回想一下,Haskell 是一种面向表达式的语言。在命令式语言中,从 if 中省略 else 分支是有意义的,因为我们使用的是语句,而不是表达式。但是,当我们使用表达式时,如果谓词评估为 False,则缺少 else 的 if 将不会有结果或类型,因此这是荒谬的。

    在命令式语言中,if 语句告诉计算机执行某些操作,但它不必返回类型化对象。在 Haskell 中,它是一种尊重类型系统以避免意外副作用的表达式。

    【讨论】:

      猜你喜欢
      • 2014-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-19
      • 2011-09-05
      • 1970-01-01
      • 2014-12-28
      相关资源
      最近更新 更多