【发布时间】:2012-07-27 09:07:46
【问题描述】:
Data.Stream 的 monad 实例是这样定义的:
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 采用第一个流的第一个元素,第二个流的第二个元素等,因此可以将生成的流视为“主对角线”,丢弃所有其他元素。
现在有一种方法可以遍历无限二维表,由 Georg Cantor 发现,他证明有理数与自然数一样多:http://www.jcu.edu/math/vignettes/infinity.htm
现在我的问题是join 使用沿所有次对角线的路径(访问每个流的每个元素)是否也是有效的实现。或者这会违反单子定律之一吗?
【问题讨论】:
-
Stream只有一个(合理的)单子,但有很多共单子。详情见布伦特系列Themes on Streams。