Определение экземпляра монады Data.Stream

Экземпляр монады 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использование пути вдоль всех вторичных диагоналей (с посещением каждого элемента каждого потока )допустимой реализацией. Или это нарушит один из законов монад?

6
задан Landei 27 July 2012 в 09:07
поделиться