【问题标题】:Understanding Comonad's <$$>理解 Comonad 的 <$$>
【发布时间】:2019-06-16 14:08:28
【问题描述】:

鉴于fp-course的以下内容:

class Functor f where
  (<$>) ::
    (a -> b)
    -> f a
    -> f b

class Functor f => Extend f where
  (<<=) ::
    (f a -> b)
    -> f a
    -> f b

我这样定义&lt;$$&gt;

(<$$>) ::
  Comonad f =>
  (a -> b)
  -> f a
  -> f b
(<$$>) f fa = f <$> fa

但是,我很想知道是否有其他方法可以在不使用 &lt;$&gt; 的情况下实现 &lt;$$&gt;。有没有?如果有,请出示!

【问题讨论】:

    标签: haskell comonad


    【解决方案1】:

    你需要Comonadextract方法;没有fmapExtend 是不够的。

    (<$$>)
      :: Comonad f
      => (a -> b)
      -> f a
      -> f b
    f <$$> w = f . extract <<= w
    

    这基本上就是liftWControl.Comonad中的实现方式。

    还要注意,您需要&lt;&lt;=(或extend); extractduplicate 是不够的。情况与BindMonad类似;您可以使用&gt;&gt;=pure 实现fmap,但不能单独使用&gt;&gt;=,也不要使用joinpure

    【讨论】:

    • 用隐喻的方式解释这一点可能是值得的:如果你想用相同的动作独立地编辑结构中的每个值(fmap/(&lt;$&gt;)),你可以通过编辑其上下文中的每个值 (extend/(&lt;&lt;=)) 并忽略给定的上下文 (extract) 来完成它。
    猜你喜欢
    • 1970-01-01
    • 2014-07-23
    • 2020-03-26
    • 2012-06-21
    • 2018-03-15
    • 2015-02-01
    • 2021-01-20
    • 2017-02-19
    • 1970-01-01
    相关资源
    最近更新 更多