33

我在某处读到 jQuery 是一个单子,这个答案表明 underscore.js 库中的链函数不是单子(而是comonad)。并且对此类似的答案表明这是幺半群。

那么,jQuery 是一个单子吗?

4

2 回答 2

32

大多数 API 不满足单子定律。jQuery是一个很大的API,因此在统计上,它不太可能是“偶然”的单子。因此,我非常怀疑jQuery整个 API 能否满足单子定律(即“jQuery 是单子”)。

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

由于似乎没有人提供证据证明 API 全部或部分满足法律,我建议我们应该假设它不满足,直到提供证据。

必须显示:

  • jQuery 操作对应于什么return(将值提升到 jQuery monad)?
  • jQuery 操作对应于什么bind,用于将计算粘合在一起?
  • 左、右和结合律如何适用于这些操作?

然后,考虑到 jQuery API 的其余部分,哪些违法行为是可能的?例如,我可以bind通过调用其他 API 函数之一来破坏吗?

参考:

于 2012-05-08T13:33:23.790 回答
12

我认为您指的是 jQuery 的隐式循环行为。在这方面,jQuery 类似于在 list monad 中工作,其中链接相当于bind,并且将元素包装在其中$()类似于return(我猜)。

因此,在 jquery 中,您可以将一个新的列表元素附加到一堆 div 列表中:

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

...在哈斯克尔你可能有:

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

以上来自记忆,应该被认为是伪代码废话。

无论如何,我认为说“jQuery 是一个 Monad”有点牵强。

于 2012-05-08T14:44:50.877 回答