在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
时会有哪些抽象?
答案 0 :(得分:9)
Extend
是Comonad
,无法extract
。这是一个“几乎是comonad”,如果你想这样想的话。提出“comonads的含义是什么”这个问题可能更有帮助。然后,当您发现几乎是comonad的东西时,您知道可以使用Extend
来表示它。我建议Neighborhood of 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这个例子!)