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

时间:2018-01-18 02:32:09

标签: haskell category-theory abstract-algebra

在Haskell中,有一个名为itertools.chain.from_iterable的类型类。

该类定义如下

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时会有哪些抽象?

1 个答案:

答案 0 :(得分:9)

ExtendComonad,无法extract。这是一个“几乎是comonad”,如果你想这样想的话。提出“comonads的含义是什么”这个问题可能更有帮助。然后,当您发现几乎是comonad的东西时,您知道可以使用Extend来表示它。我建议Neighborhood of Infinity以示例的方式介绍comonads。

顺便提一句,我们对MonadApplicative也有类似的看法。 BindMonad,但没有returnApplyApplicative但没有pure。您可以在链接的同一semigroupoids包中找到这两个类。

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