haskell - 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
解决方案
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 的书中。
推荐阅读
- hibernate - 如何在标准 api 中选择 count(*)?
- reactjs - 无法在 GitHub gh-pages 上部署反应应用程序
- java - android sdk v23 上的 Kuzzle V2 实时订阅
- sql - 在 WHERE 语句中使用的 SQL 索引
- python - Groupby 性别并计算高度列中的缺失值
- css - @keyframes 动画背景位置不起作用
- azure-functions - Azure Functions BlobTrigger 属性绑定问题
- python - 如何在 jupyterhub 页面中使用 python-selenium 查找现有的 HTML 元素?
- html - 我的响应式网站不适用于三星和 OPPO 手机。为什么?
- python - 如果实际数据嵌入了相同的分隔符,如何使用 Spark RDD 读取分隔文件