Код выполняется вечно, потому что вы пытаетесь упорядочить бесконечное количество побочных вычислений при вызове mapM
.
Поскольку вы не знаете заранее, сколько из этих вычислений вам нужно будет выполнить (как указано в вашем использовании catMaybes
), вам придется чередовать вызовы на getFilePathForDay
с остальными вашими вычисление. Это можно сделать с помощью unsafeInterleaveIO
, но, как следует из названия, это не рекомендуемый подход.
Вы можете реализовать это вручную как:
getFilePathForDays _ 0 = return []
getFilePathForDays date days = do
mpath <- getFilePathForDay date
case mpath of
Just path -> (path :) <$> remaining (days-1)
Nothing -> remaining days
where
remaining days = getFilePathForDays (addDays 1 date) days
Возможно, есть более элегантный способ, но он сейчас не подходит мне:)