5

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

该类定义如下

class Functor w => Extend w where
    extended :: (w a -> b) -> w a -> w b

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

extended f . extended g = extended (f . extended g)

我可以看到它与Functor. 特别是,Functor的属性 fmap f . fmap g == fmap (f . g)看起来类似于Extend

你会如何解释Extend?它有什么意义?它是否使任何计算更容易?使用时做了哪些抽象Extend

4

1 回答 1

9

Extend是一个Comonad没有能力的人extract。如果你想这样想的话,它是一个“几乎是comonad”。询问“comonads 的含义是什么”这个问题可能更有帮助。然后,当您找到几乎是共单子的东西时,您就知道可以用Extend它来表示它。我推荐无限邻域以通过示例介绍共单子。

Monad顺便说一下,我们对and也有类似的东西ApplicativeBindMonad但没有return,并且ApplyApplicative但没有puresemigroupoids您可以在链接的同一个包中找到这两个类。

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

于 2018-01-18T02:48:36.560 回答