Haskell中Extend type class的含义是什么?

mtb*_*r75 5 haskell category-theory abstract-algebra

在Haskell中,有一个名为Extend的类型类.

该类定义如下

class Functor w => Extend w where
    extended :: (w a -> b) -> w a -> w b
Run Code Online (Sandbox Code Playgroud)

Extend该类的每个实例都应具有以下属性:

extended f . extended g = extended (f . extended g)
Run Code Online (Sandbox Code Playgroud)

我可以看到它的相似之处Functor.特别是,其Functor财产 fmap f . fmap g == fmap (f . g)看起来类似于Extend.

你会怎么解释Extend?它的意义是什么?它是否使任何计算更容易?使用时会产生什么样的抽象Extend

Sil*_*olo 9

ExtendComonad没有能力的extract.这是一个"几乎是comonad",如果你想这样想的话.提出"comonads的含义是什么"这个问题可能更有帮助.然后,当你发现几乎是comonad的东西时,你知道你可以Extend用来代表它.我推荐使用Infinity的邻居来举例说明comonads.

我们也有类似的事情MonadApplicative,顺便说一句.BindMonad,但没有return,而且ApplyApplicative却没有pure.您可以在semigroupoids链接的同一个包中找到这两个类.

作为一个例子,非空列表形成一个comonad,用duplicate = tailsextract = head.然后extend f = fmap f . duplicate.如果我们有NonEmpty,这很好,但如果列表可能为空,extract = head则不再是一个完整的函数.我们仍然有duplicateextend,所以[]可以Extend,但不能Comonad.(感谢@phadej这个例子!)

  • 你应该提一下`[]`作为'Extend`而不是`Comonad`的明显例子.事实上,列表的"重复"非常容易理解! (2认同)