就像标题中所说的那样:'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
问题位于loop_args
功能中:
loop_args argc args = do
let i = 0
i <- check_args argc args i
写i <- …
没有任何意义,因为您在这里定义了一个名为i
的new变量(与i
中的let i = 0
没有多大关系),并且您不使用那个变量。您可以将其替换为check_args argc args i
,错误将消失,但可能仍然无法按照您希望的方式工作。
但是总的来说,该程序看起来是命令式,而Haskell是声明式语言。这意味着每个变量(因此i
)都是不可变的,因此可以通过incrementing变量not循环。此外,在声明性语言中,没有太多的“循环”等。目标不是指定要执行的操作,而是要执行的操作。您可能在这里想使用可以在mapM_ :: (Foldable f, Monad m) => (a -> m b) -> f a -> m ()
对象中移动的mapM_ :: (Foldable f, Monad m) => (a -> m b) -> f a -> m ()
,并将monadic函数应用于所有项目:Foldable