2012-05-08 29 views
31

我读过jQuery是monad的地方,this answer显示underscore.js库中的链函数不是monad(但是是comonad)。和answer to this相似,说明是monoid。jQuery是一个monad

那么,jQuery是一个单子吗?

+0

我不知道jQuery,所以回答这个问题的能力有限,但如果你看他们的正确方式[1],http [1]具有一元结构一般意味着也具有一元结构[1]:[http://www.google.com/store/docs/details.aspx? :// comonad。com/reader/2011/monads-from-comonads/ –

+6

您是否要求某人证明monad规则对于jQuery API的核心有效? –

回答

31

大多数API不符合单子法。 jQuery是一个很大的API,所以统计上,它不太可能是“意外”的一元。因此,我非常怀疑jQuery API作为一个整体可以满足monad规则(即“jQuery是monad”)。

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

由于似乎没有人提供证据表明API的全部或部分符合法律,所以我建议我们应该假设它没有,直到提供证据为止。

必须表明:

  • 什么jQuery的操作对应于return(提升一个值到jQuery的单子)?
  • 什么jQuery操作对应于bind,用于粘合计算在一起?
  • 左,右和相关性法律对这些操作有何影响?

然后,鉴于jQuery API的其他部分,可能违反什么法律?例如,我可以通过调用其他API函数来破坏bind吗?

参考文献:

+2

第一个链接404s。 –

11

我想你指的是jQuery的隐式的循环行为。在这方面,jQuery类似于在列表monad中工作,其中链接等效于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”将是一个延伸。