在您找到的chain
文档中:
调用
chain
一个包装的对象将导致所有未来的方法调用也返回包装的对象。完成计算后,使用value
检索最终值。
那么这个chain
函数会创建一个单子吗?
不,不是单子,而是共子!它将一个接受包装对象并返回正常值的函数转换为一个接受并返回包装对象的函数。作为 Haskell 类型签名,它将是:
(Wrapped a -> b) -> (Wrapped a -> Wrapped b)
的类型签名value
是:
Wrapped a -> a
这些正是您需要的comonad。通常调用第一个函数,extend
然后调用第二个函数extract
。
您可以将comonad 视为具有一些额外上下文的值。当然,这正是chain
它的作用。
有关comonads 的更多信息,请参阅这个 Stackoverflow 问题。