Экземпляр монады Data.Stream определяется таким образом:
instance Monad Stream where
return = repeat
xs >>= f = join (fmap f xs)
where
join :: Stream (Stream a) -> Stream a
join ~(Cons xs xss) = Cons (head xs) (join (map tail xss))
Это означает, что join
принимает первый элемент первого потока, второй элемент второго потока и т. д., поэтому результирующий поток можно рассматривать как «главную диагональ», отбрасывая все остальные элементы.
Теперь есть способ просмотреть бесконечную двумерную -таблицу измерений, открытую Георгом Кантором для доказательства того, что существует столько же рациональных чисел, сколько и натуральных:http://www.jcu.edu/math/vignettes/infinity.htm
Теперь мой вопрос заключается в том, будет ли join
использование пути вдоль всех вторичных диагоналей (с посещением каждого элемента каждого потока )допустимой реализацией. Или это нарушит один из законов монад?