首页 > 解决方案 > Haskell 'do' 块中的最后一条语句必须是表达式错误

问题描述

你好,有人能告诉我这个错误来自哪里吗?错误是 DKA-2-MKA.hs:39:5:“do”块中的最后一条语句必须是表达式 argv <- getArgs

我已经检查过意图,但没有帮助

 import System.Environment
 import System.Console.GetOpt
 import Data.Maybe ( fromMaybe )

 data Options = Options { optI :: Boo , optT :: Bool } deriving (Show)

 defaultOptions :: Options
 defaultOptions = Options { optI = False, optT = False }

 options :: [OptDescr (Options -> Options)]
 options = [ Option ['i']    ["I"]
             (NoArg (\ opts -> opts {optI = True}))
             "I is true"
           , Option ['t']    ["T"]
             (NoArg (\ opts -> opts {optT = True}))
             "T is true"
           ]

 programOpt :: [String] -> IO (Options, String)
 programOpt argv = 
     case getOpt Permute options argv of
         (o, n, [] ) -> return (foldl (flip id) defaultOptions o, n) 
         (o, _, [] ) -> ioError $ userError $ exactlyone ++ usageInfo header options
         (_, _, errs) -> ioError $ userError $ concat errs ++ usageInfo header options
     where
         header = "Usage [OPTIONS...] filename"
         exactlyone = "One input"


 main :: IO ()
 main = do
     argv <-getArgs 

标签: haskell

解决方案


DKA-2-MKA.hs:39:5:“do”块中的最后一条语句必须是表达式 argv <- getArgs

  • 39:5表示错误在第 39 行第 5 列。看起来像argv <- getArgs
  • “表达式”是一段在语法上有效、有类型并且可以计算的代码。表达式的示例包括

    • let x = 1 in x + 2
    • if b then x else y
    • 5
    • return ()
  • not 表达式的示例包括:

    • (1
    • let x = 5
    • if b then x

argv <-getArgs不是表达式,它是一种悬空的语法,本身没有意义你不能问 ghci :t argv <-getArgs

为了理解为什么块中的最后一行do必须是表达式,请在本网站或其他地方搜索“desugaring do notation haskell”(也许其他人可以推荐特定资源)。这也将出现在任何介绍 Haskell 的书中。


推荐阅读