ОБНОВЛЕНИЕ: Хорошо, этот вопрос становится потенциально очень простым.
q <- mapM return [1..]
Почему это никогда не возвращается?
Является ли mapM не лениво иметь дело с бесконечными списками?
Ниже приведен код. Однако, если я заменю строку A на строку B, она больше не висит. В качестве альтернативы, если я преследую строку A с помощью "splitRandom $", она также не зависает.
Q1: Является ли mapM не ленивым? В противном случае, почему замена строки A на строку B "исправить этот" код?
Q2: Почему преследующая строка A с splitRandom "решает" проблему?
import Control.Monad.Random
import Control.Applicative
f :: (RandomGen g) => Rand g (Double, [Double])
f = do
b <- splitRandom $ sequence $ repeat $ getRandom
c <- mapM return b -- A
-- let c = map id b -- B
a <- getRandom
return (a, c)
splitRandom :: (RandomGen g) => Rand g a -> Rand g a
splitRandom code = evalRand code <$> getSplit
t0 = do
(a, b) <- evalRand f <$> newStdGen
print a
print (take 3 b)
Код генерирует бесконечный список случайных чисел лениво. Затем он генерирует одно случайное число. Используя splitRandom, я могу оценить это последнее случайное число перед бесконечным списком. Это можно продемонстрировать, если я верну b вместо функции c.
Однако, если я применил mapM к списку, программа теперь зависает. Чтобы предотвратить эту зависание, я должен снова применить splitRandom перед mapM. У меня создалось впечатление, что mapM может лениво