【发布时间】:2020-03-01 11:26:26
【问题描述】:
正如标题中所说:“do”构造中的最后一条语句必须是表达式是什么意思?我知道还有其他科目与我类似,但我仍然找不到我的错误。
代码:
import System.Environment
check_args argc args i = do
putStrLn $ show (args !! i)
i <- return (i + 1)
if argc > i
then mydisplay2 argc args i
else return i
loop_args argc args = do
let i = 0
i <- check_args argc args i
main = do
args <- getArgs
putStrLn "The arguments are:"
loop_args (length args) args
【问题讨论】:
-
i <- check_args argc args i没有任何意义,因为您不会对i做任何事情。您可以将其重写为check_args argc args i。但在我看来,您的目标是在 Haskell 中以一种命令式的方式进行编程。请注意,通常不会使用那么多do,return不是关键字,而是一个函数,其工作方式与您在命令式语言中所期望的不同。 -
好的,谢谢您的回答。我是 Haskell 的新手,我完全迷路了,我想做的是一一检查 argv,然后比较它们。
-
我强烈推荐 Learn You A Haskell 作为最好的和最易读/易懂的语言介绍。 This chapter 将与您的当前需求最相关,但我强烈建议您也阅读前面的章节,特别是要了解纯函数式编程与命令式编程的不同之处。
-
如果您要尝试对
do块进行脱糖,您将得到check_args args args i >>= \i ->:一个没有正文的 lambda 表达式。 -
@chepner 另一种表明它的方式是,根据 Monad 定律,任何 do 块
do { .... ; A }都等同于do { .... ; r <- A ; return r }和r <- i <- ....是毫无意义的错误语法。