我有一个像下面这样的无限结构(使用流包中的Stream类型):
data U x = U (Stream x) x (Stream x) deriving (Functor,Foldable)
我想为它提供一个 Traversable 实例,如下所示:
instance Traversable U where
traverse f (U lstream focus rstream) =
let pairs = liftA unzip
. sequenceA . fmap (traversepair f)
$ zip lstream rstream
traversepair f (a,b) = (,) <$> f a <*> f b
rebuild c (u,v) = U u c v
in rebuild <$> f focus <*> pairs
Data.Traversable的文档说它们代表“可以从左到右遍历的数据结构类”。但是我的定义不是从左到右遍历,而是向外遍历。我必须以这种方式定义它,以便在涉及Rand monad的序列操作之后能够在两侧延迟提取值。
它仍然是一个有效的定义吗?我注意到Traversable 的 Typeclassopedia 条目没有说任何关于“从左到右”的内容,它只讨论了“交换两个函子”。