jQuery是一个单子吗?

33

我在某个地方读到,jQuery是一个单子(monad),而这个回答表明,underscore.js库中的链式函数(chain function)不是一个单子(但是是共单子(comonad)。类似的这个回答显示它是一个幺半群(monoid)。

那么,jQuery是一个单子吗?


我不懂jQuery,所以在回答這個問題方面能力有限,但是如果你從正確的角度看待它們,具有共同單子結構的事物通常也意味著具有單子結構。 - Philip JF
7
你是在询问某人是否能展示Monad规律对于jQuery API核心的适用性吗? - Don Stewart
“Monad”实际上描述的是一种方法(和使用模式),而不是一种类型。jQuery有大量的方法,但据我所知,它们中没有一个符合单子的定义。这是件好事!如果基于单子链接,jQuery将变得更冗长和繁琐。 - JacquesB
2个回答

32

大部分API不满足单子律。 jQuery是一个庞大的API,因此从统计上来看,它不太可能“无意中”成为单子。因此,我相当怀疑整个jQuery API是否能满足单子律(即“jQuery是一个单子”)。

这并不意味着某个(非常受限制的)子集不可能满足它们,但整个API很可能包含“不安全”的操作,使用时会违反法律,破坏抽象。

由于似乎没有人提供证据表明API整体或部分满足法律,因此我建议我们假设它不满足,直到提供证据为止。

必须显示:

  • 哪个jQuery操作对应于return(将值提升到jQuery单子)?
  • 哪个jQuery操作对应于bind,用于粘合计算?
  • 左、右和结合律如何适用于这些操作?

然后,鉴于其余的jQuery API,可能存在什么样的违法行为?例如,我可以通过调用其他API函数之一来打破bind吗?

参考文献:


12

我认为你指的是jQuery的隐式循环行为。在这方面,jQuery类似于在列表单子中工作,其中链接相当于bind,而用$()包装一个元素类似于return(我猜)。

因此,在jQuery中,如果你想将一个新的列表元素附加到一系列div和列表中,可以这样做:

$('div').children().append("<li>New list element</li>");

在 Haskell 中可能会有:

appendToEachList divs = divs >>= children >>= append "<li>New list element</li>"

以上内容为记忆中的伪代码,并不具有实际意义。

总之,我认为说"jQuery是一个Monad"有些牵强附会。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接