С вопросом Список всего содержимого каталога по порядку ширины приводит к низкой эффективности. Я узнал, что низкая эффективность объясняется странным поведением рекурсивные функции монады.
Try
sequence $ map return [1..]::[[Int]]
sequence $ map return [1..]::Maybe [Int]
и ghci попадет в бесконечный расчет.
Если мы перепишем функцию последовательности в более читаемой форме, например:
sequence' [] = return []
sequence' (m:ms) = do {x<-m; xs<-sequence' ms; return (x:xs)}
и попробуйте:
sequence' $ map return [1..]::[[Int]]
sequence' $ map return [1..]::Maybe [Int]
мы получаем ту же ситуацию, бесконечный цикл.
Попробуйте конечный список
sequence' $ map return [1..]::Maybe [Int]
после долгого ожидания ожидает spring ожидаемого результата Just [1,2,3,4..]
.
Из того, что мы пробовали, мы можем прийти к выводу, что хотя определение последовательности "кажется ленивым, оно строгое и должно отображать все числа до того, как будет напечатан результат последовательности".
Не только просто последовательность ", если мы определим функцию
iterateM:: Monad m => (a -> m a) -> a -> m [a]
iterateM f x = (f x) >>= iterateM0 f >>= return.(x:)
и попробуйте
iterateM (>>=(+1)) 0
то происходит бесконечный расчет.
Как мы все знаем, неравномерная итерация определяется так же, как и предыдущая итерацияM, но почему итерация ленива и iterateM строго. Как видно из вышеизложенного, итерация М и последовательность 'являются рекурсивными монадическими функциями. Есть ли что-то странное с рекурсивными монадическими функциями