问题描述
尽管用专业术语填充标题,但我认为这个问题并不复杂。
人物介绍
这里有两个重要的Functor组合器。 Flip
等同于haskell函数g flip
,但对类型进行操作
newtype Flip p a b
= Flip
{ unFlip :: p b a
}
和Join
等效于类型上的W组合器,它需要一个bifunctor并沿着其两个参数生成一个functor
newtype Join p a
= W
{ unW :: p a a
}
Traversable
现在Foldable
可以创建以下实例:
instance
( forall a . Foldable (p a),forall a . Foldable (Flip p a)
)
=> Foldable (Join p) where
foldr g x (W xs) = foldr g (foldr g x xs) (Flip xs)
也就是说,如果p
在两个参数上都是可折叠的,则Join p
是可折叠的。这是通过向左然后向右折叠来完成的。
现在,我想为Traversable
创建一个类似的实例,但是我遇到了一个问题。我可以很容易地写出sequence
sequence (W xs) = (map W . join . map (sequenceA . unFlip) . sequenceA . Flip) xs
但是,似乎我需要能够使用join
,所以我在写sequenceA
时遇到了麻烦。实际上,写sequenceA
似乎非常不可能。
但是,我很难提出一个反例。这是一个p
,可在两个参数上遍历,但在加入时不可遍历。
到目前为止,我已经尝试了所有基础知识,但没有一个是反例。 Join (,)
是可遍历的
sequenceA (W (x,y)) = liftA2 (W . (,)) x y
像Join ((,) a)
这样的高阶元组也可以。
sequenceA (W (x,y,z)) = liftA2 (W . (,) x) y z
Join Either
也是可遍历的
sequenceA (W (Left x)) = map (W . Left) x
sequenceA (W (Right x)) = map (W . Right) x
我通过组合类型提出了更多示例,为简单起见,我将省略这些示例,但不用说它们最终都是可遍历的。
有反例吗?可以写这个实例吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)