首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Iso提升为双函子的第一个参数

将Iso提升为双函子的第一个参数
EN

Stack Overflow用户
提问于 2015-12-08 11:03:35
回答 1查看 109关注 0票数 3

Control.Lens.Iso包含许多出色的函数,用于将Iso提升为各种类型的有用抽象参数。例如:

  • 适用于任意mappingFunctor
  • contramappingContravariant函子
  • dimappinglmappingrmappingProfunctors
  • bimapping for Bifunctors

我正在寻找将Iso提升到Bifunctorfirst参数的函数,但它似乎并不存在。我目前正在对其作出这样的定义:

代码语言:javascript
复制
firsting
  :: Bifunctor f
  => AnIso s t a b
  -> Iso (f s x) (f t y) (f a x) (f b y)
firsting p = bimapping p (iso id id)

这个函数已经存在于某个地方了,还是bimapping p (iso id id)就像它得到的一样好?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-08 17:15:03

更新

感谢您的提问,Control.Lens.Iso 将包括 firstingseconding的下一个版本。

iso id id看起来有点丑。我们试着把它拆开。

代码语言:javascript
复制
type Iso s t a b =
  forall f p . (Functor f, Profunctor p) =>
                               p a (f b) -> p s (f t)

--plain :: Iso s t s t
--plain = iso id id

plain :: (Functor f, Profunctor p) => p s (f t) -> p s (f t)
plain = id

这样你就可以把你的实现缩减到

代码语言:javascript
复制
firsting p = bimapping p id

这可能是最简洁的形式。如果你想真正做到这一点,那就继续读下去吧。

bimapping定义的内嵌

代码语言:javascript
复制
bimapping :: (Bifunctor f, Bifunctor g) => AnIso s t a b -> AnIso s' t' a' b' -> Iso (f s s') (g t t') (f a a') (g b b')
bimapping f g = withIso f $ \ sa bt -> withIso g $ \s'a' b't' ->
  iso (bimap sa s'a') (bimap bt b't')

如果使用first进行简化,您将得到

代码语言:javascript
复制
firsting p = withIso p $ \ sa bt ->
             iso (first sa) (first bt)

我认为这是一个特别明确的表述。它使用withIsop分解为构成同构的两个函数,使用first将它们中的每一个函数提升到双函子的第一个参数,然后将它们打包回iso。如果相关的双函子有一个优化的first,它比使用bimap做得更好,那么这也将比使用bimapping的实现更快。

内联iso

代码语言:javascript
复制
firsting p = withIso p $ \ sa bt ->
             dimap (first sa) (fmap (first bt))

最后,内联withIso (深入Control.Lens.Internal.Iso,我们可能不应该这么做),

代码语言:javascript
复制
firsting p =
  case p (Exchange id Identity) of
    Exchange sa bt ->
      dimap (first sa) (fmap (first (runIdentity #. bt)))

顺便说一句,没有冗余上下文的plain的类型签名是

代码语言:javascript
复制
plain :: p s (f t) -> p s (f t)

这和

代码语言:javascript
复制
plain :: Equality s t s t
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34154211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档