加入的Bitraversable是否需要Monad?

问题描述

尽管用专业术语填充标题,但我认为这个问题并不复杂。

人物介绍

这里有两个重要的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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...