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?
Extend是Comonad没有能力的extract.这是一个"几乎是comonad",如果你想这样想的话.提出"comonads的含义是什么"这个问题可能更有帮助.然后,当你发现几乎是comonad的东西时,你知道你可以Extend用来代表它.我推荐使用Infinity的邻居来举例说明comonads.
我们也有类似的事情Monad和Applicative,顺便说一句.Bind是Monad,但没有return,而且Apply是Applicative却没有pure.您可以在semigroupoids链接的同一个包中找到这两个类.
作为一个例子,非空列表形成一个comonad,用duplicate = tails和extract = head.然后extend f = fmap f . duplicate.如果我们有NonEmpty,这很好,但如果列表可能为空,extract = head则不再是一个完整的函数.我们仍然有duplicate和extend,所以[]可以Extend,但不能Comonad.(感谢@phadej这个例子!)