Последний оператор в блоке 'do' должен быть выражением - PullRequest
1 голос
/ 01 марта 2020

Как сказано в заголовке: что означает последнее выражение в конструкции 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

1 Ответ

3 голосов
/ 01 марта 2020

Проблема находится в функции loop_args:

loop_args argc args = do
        let i = 0
        <b>i <-</b> check_args argc args i

Нет смысла писать i <- &hellip;, так как здесь вы определяете переменную new с именем i (это не имеет ничего общего с i в let i = 0), и вы вообще не используете эту переменную. Вы можете заменить его на check_args argc args i, и ошибка исчезнет go, но, вероятно, она все равно не будет работать так, как вы хотите, чтобы это работало.

Но в целом программа выглядит императивной , тогда как Haskell является декларативным языком. Это означает, что каждая переменная (т.е. i) является неизменной, поэтому вы можете не l oop путем увеличения переменной. Кроме того, в декларативном языке не так много «зацикливания» и т. Д. c. Цель состоит не в том, чтобы указать , как вы хотите что-то сделать, а в , что вы хотите сделать.

Вы, вероятно, здесь хотите использовать mapM_ :: (Foldable f, Monad m) => (a -> m b) -> f a -> m (), который может перемещаться через объект Foldable и применять функцию monadi c ко всем элементам:

main = do
    args <- getArgs
    putStrLn "The arguments are:"
    <b>mapM_ putStrLn</b> args
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...