Простой цикл Haskell
Я только начал изучать Haskell, но отсутствие петель бесконечно расстраивает прямо сейчас. Я понял, как писать циклы для функций. Моя проблема, однако, в том, что я хочу вывести некоторые результаты при повторении цикла. Кажется, что я должен использовать debug для выполнения этой простой задачи.
Итак, сейчас я просто хотел бы оценить пример того, как печатать строку в 10 раз в основной структуре.
Другими словами, я хочу сделать это 10 раз:
main = do
putStrLn "a string"
Спасибо. Я чувствую, что это будет очень освещать мою задачу.
Ответы
Ответ 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]]
Итак, здесь мы определили список, элементами которого являются строки, которые вы хотите распечатать, а затем новый символ строки.