Почему функция последовательности Haskell не может быть ленивой или почему рекурсивные монадические функции не могут быть ленивыми
С вопросомРаспечатка всего содержимого каталога в порядке первого порядка приводит к низкой эффективностиЯ узнал, что низкая эффективность обусловлена странным поведением рекурсивных функций монады.
Пытаться
sequence $ map return [1..]::[[Int]]
sequence $ map return [1..]::Maybe [Int]
и ghci попадет в бесконечный расчет.
Если переписать функцию последовательности в более читабельном виде, как показано ниже:
sequence' [] = return []
sequence' (m:ms) = do {x m a) -> a -> m [a]
iterateM f x = (f x) >>= iterateM0 f >>= return.(x:)
и попробовать
iterateM (>>=(+1)) 0
тогда происходит бесконечный расчет.
Как мы все знаем, немонадная итерация определяется так же, как и вышеупомянутый iterateM, но почему итерация ленива, а iterateM строг. Как видно из вышеизложенного, как iterateM, так и sequence ' рекурсивные монадические функции. Есть ли что-то странное с рекурсивными монадическими функциями