Проблема находится в функции loop_args
:
loop_args argc args = do
let i = 0
<b>i <-</b> check_args argc args i
Нет смысла писать i <- …
, так как здесь вы определяете переменную 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