次のような無限の構造があります ( streamsパッケージの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モナドを含むシーケンス操作の後で両側の値を遅延抽出できるように、そのように定義する必要がありました。
それにもかかわらず、それは有効な定義ですか? Traversable の Typeclassopedia エントリには、「左から右」については何も書かれておらず、「2 つのファンクターの交換」についてのみ言及されていることに気付きました。