Haskell'do'块中的最后一条语句必须是表达式错误

时间:2019-02-11 15:02:05

标签: haskell

您好,有人可以告诉我此错误来自何处吗? 错误是 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 

1 个答案:

答案 0 :(得分:2)

  

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 ()
  • 非表达式的示例包括:

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

argv <-getArgs不是 表达式,它只是语法的一小部分,其本身并不有意义。您不能问ghci :t argv <-getArgs

为了了解为什么 do块中的最后一行必须是表达式,请在此站点或其他位置搜索“ desugaring do notation haskell”(也许其他人可以推荐一个具体资源)。这也将出现在任何haskell入门书籍中。