【问题标题】:Is jQuery a monadjQuery是一个单子吗
【发布时间】:2012-05-16 20:06:01
【问题描述】:

我在某处读到 jQuery 是 monad,this answer 表明 underscore.js 库中的链函数不是 monad(而是comonad)。和answer to this 相似,表明它是幺半群。

那么,jQuery 是 monad 吗?

【问题讨论】:

  • 我不知道 jQuery,所以回答这个问题的能力有限,但是如果你以正确的方式看待它们 [1 ]:comonad.com/reader/2011/monads-from-comonads
  • 你是在要求某人证明 jQuery API 的核心是 monad 法则吗?
  • "Monad" 真正描述的是一种方法(和一种使用模式),而不是一种类型。 jQuery 有大量的方法,但没有一个(AFAICT)符合 monad 的定义。这是一件好事!如果 jQuery 基于一元链,它只会更加冗长和繁琐。

标签: jquery functional-programming monads


【解决方案1】:

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

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

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

必须显示:

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

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

参考资料:

【讨论】:

    【解决方案2】:

    我认为您指的是 jQuery 的隐式循环行为。在这方面,jQuery 类似于在 list 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”有点牵强。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-11
      • 2011-11-18
      • 2011-08-15
      • 2016-10-25
      • 1970-01-01
      • 2017-06-01
      相关资源
      最近更新 更多