Haskell Underline.js中的链函数是否创建了monad?

Haskell Underline.js中的链函数是否创建了monad?,haskell,functional-programming,monads,underscore.js,comonad,Haskell,Functional Programming,Monads,Underscore.js,Comonad,你会发现: 对包装对象调用chain将导致以后所有的方法调用 也可以返回包裹的对象。当你完成任务的时候 计算时,使用值检索最终值 那么函数是否创建了单子呢?不,不是单子,而是一个单子!它将接受包装对象并返回正常值的函数转换为接受并返回包装对象的函数。作为Haskell类型的签名,将是: (Wrapped a -> b) -> (Wrapped a -> Wrapped b) 值的类型签名为: Wrapped a -> a 这些正是你需要的一个科摩纳德。第一个函数通常称

你会发现:

对包装对象调用
chain
将导致以后所有的方法调用 也可以返回包裹的对象。当你完成任务的时候 计算时,使用
检索最终值


那么函数是否创建了单子呢?

不,不是单子,而是一个单子!它将接受包装对象并返回正常值的函数转换为接受并返回包装对象的函数。作为Haskell类型的签名,将是:

(Wrapped a -> b) -> (Wrapped a -> Wrapped b)
值的类型签名为:

Wrapped a -> a
这些正是你需要的一个科摩纳德。第一个函数通常称为
extend
,第二个函数称为
extract

您可以将comonad视为具有一些额外上下文的值。当然,这正是
chain
所做的


有关comonads的更多信息,请参阅。

我将此标记为haskell,因为Haskeller可能会对此话题发表一些看法;我认为,如果你解释下划线对象方法到类型的映射,你的意思会更明显。如果我理解正确,方法通常是
包装的a->b
s,但是
返回一个对象,其方法(除了
)都是
包装的a->b
s。我知道一点Haskell,但这个问题最初并没有标记为Haskell,因此解释您的答案如何映射到JS库可能会有所帮助。我在这里有一个类似的评论:我将chain理解为一个函数,它接受一个值并返回一个包装的对象,所以
chain::a=>包装的a
,这使得它看起来像是一个一元的
返回
单元
。在
Wrapped
上使用的方法是
method::Wrapped a->(a->b)->Wrapped b
。例如,map或reduce(
\uf->reduce(\uf,seed)
)。这看起来像是标准的
方法f=fmap f
,每个方法都有不同的f。除了
方法之外,它是
::包装了一个->一个
,看起来确实像一个comonadic
提取
。可能涉及到科摩纳德,但不容易看到。