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
、最初のストリームの最初の要素、2 番目のストリームの 2 番目の要素などを取得するため、結果のストリームは「主対角線」と見なされ、他のすべての要素が破棄されます。
現在、Georg Cantor が自然数と同じ数の有理数が存在することを証明するために発見した、無限の 2 次元テーブルを通過する方法があります: http://www.jcu.edu/math/vignettes/infinity.htm
ここで私の質問は、join
すべての二次対角線に沿ったパスを使用する (すべてのストリームのすべての要素を訪問する) ことも有効な実装になるかどうかです。それとも、これはモナドの法則の 1 つに違反しますか?