Подтвердить что ты не робот

Простой цикл Haskell

Я только начал изучать Haskell, но отсутствие петель бесконечно расстраивает прямо сейчас. Я понял, как писать циклы для функций. Моя проблема, однако, в том, что я хочу вывести некоторые результаты при повторении цикла. Кажется, что я должен использовать debug для выполнения этой простой задачи.

Итак, сейчас я просто хотел бы оценить пример того, как печатать строку в 10 раз в основной структуре.

Другими словами, я хочу сделать это 10 раз:

main = do  
    putStrLn "a string" 

Спасибо. Я чувствую, что это будет очень освещать мою задачу.

4b9b3361

Ответ 1

Вы можете определить рекурсивную функцию, которая печатает "строку" n раз (n является параметром функции), например:

printStringNTimes 0 = return ()
printStringNTimes n =
 do
  putStrLn "a string"
  printStringNTimes (n-1)

main = printStringNTimes 10

Несколько более общий подход заключался бы в определении функции, которая повторяет любое действие IO n раз:

repeatNTimes 0 _ = return ()
repeatNTimes n action =
 do
  action
  repeatNTimes (n-1) action

main = repeatNTimes 10 (putStrLn "a string")

Вышеуказанная функция уже существует в Control.Monad под именем replicateM_.

Ответ 2

Хорошо Haskell IO немного сложнее, когда вы только начинаете, поскольку он основан на монадах.

Ваша проблема, хотя и имеет простое решение:

main = replicateM_ 10 $ putStrLn "a string"

Это использует комбинатор replicateM_ от Control.Monad

Он имеет множество полезных функций для составления и выполнения монадических действий.

Ответ 3

Я также начинаю Haskell, и у меня есть решение, которое менее изящно и все же прагматично полезно.

main = do 
    putStr result
    where
        string = "a string"
        result = concat [string ++ "\n" | i <- [1,2..10]]

Итак, здесь мы определили список, элементами которого являются строки, которые вы хотите распечатать, а затем новый символ строки.