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

问题描述 投票:2回答:1

就像标题中所说的那样:'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
haskell syntax
1个回答
0
投票

问题位于loop_args功能中:

loop_args argc args = do
        let i = 0
        i <- check_args argc args i

i <- …没有任何意义,因为您在这里定义了一个名为inew变量(与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

© www.soinside.com 2019 - 2024. All rights reserved.