【问题标题】:What is the binary operator of Function Monoids in example of JavaScriptJavaScript示例中Function Monoids的二元运算符是什么
【发布时间】:2019-03-22 07:28:08
【问题描述】:

this article Function Monoids 中引入了 C# 代码和 Haskell 类型定义。

如果b 是一个幺半群,那么函数a -> b 就是一个幺半群。这意味着 您可以将相同类型的两个函数组合在一起。在一个 面向对象的上下文,这意味着你可以结合两种方法 只要返回类型相同,签名就变成一种方法 形成一个幺半群。

概括

虽然上面的 C# 代码只是一个示例,但一般规则是 任何返回幺半群的函数本身就是一个幺半群。在哈斯克尔, 此规则在标准库中阐明:

instance Monoid b => Monoid (a -> b)

这意味着对于任何幺半群 b,函数 a -> b 也是 (自动)一个幺半群。

问题是 C# 中的示例对“GUID”过于具体,我不知道作者在代码中试图做什么,而 Haskell 类型定义只是类型定义。

什么是 JavaScript 中实现这个 Function Monoids 的示例代码?

cf) Why is instance Monoid b => Monoid (a -> b) in base?

【问题讨论】:

  • 鉴于 javascript 没有足够复杂的类型系统,因此很难翻译。 “成为一个幺半群”不是可以表示为运行时值的东西。如果您对此感兴趣,我建议您学习 Haskell 以了解本文的含义。
  • 我不同意。要在 JavaScript 中实现 Monoid,根本不需要类型系统。蒙达斯也是如此。
  • C# 示例根本不针对 GUID。文章的重点是 Combine 函数,即使没有任何 C# 知识,您也应该能够将其翻译成 javascript。 CountPrimesCountLetters 仅用作用作 Combine 参数的函数示例。
  • @tbookq 我正在编写 cmets,因为我还没有回答你的问题“什么是 JavaScript 中的示例代码来实现这个 Function Monoids?”。我正在写 cmets 来建议改进您的问题的方法,以便我可以通过有用且易于理解的帖子正确回答它。
  • @tbookq 请edit您的问题以包括一个幺半群的任意实现作为示例(并展示您的知识水平),我会写一个适当的答案。我不想写一个对你没用的答案,但你需要提供更多信息。是你希望别人帮助他。

标签: javascript functional-programming monoids


【解决方案1】:

Monoid Laws

身份法:
combine (identity, a) == combine (a, identity)

结合律:
combine (a, combine (b, c)) == combine (combine (a, b), c)

我们可以为函数实现一个identity element (identity) 和二元运算 (combine) -

// identity element
const identity =
  x => x

// binary operation
const combine = (a, b) =>
  x => a (b (x))
 
// sample functions
const a =
  x => x + 3
  
const b =
  x => x - 1

const c =
  x => x * x

// uphold laws
console.log
  ( combine (identity, a) (2) === combine (a, identity) (2)
  , combine (a, combine (b, c)) (2) === combine (combine (a, b), c) (2)
  )
  
// => true
// => true

二进制操作和标识元素因您的域而异。请参阅Wikipedia 上的表格,了解有关如何为各种集合实现单位元和二元运算的更多信息。

当然,您不仅限于这些域。您的自定义类型可能具有满足幺半群定律的各种二元运算和标识元素。如果法律得到维护,那么您的类型就属于幺半群类别。

【讨论】:

  • 谢谢,但x => a (b (x)) 是函数的组合,即“endomorphism-monoid”,这不是本主题的内容。 blog.ploeh.dk/2017/11/13/endomorphism-monoid 在 Haskell 中,它被称为 Endo Monoid。
  • 问题是“JavaScript 示例中Function Monoids 的二元运算符是什么?”。这个答案解释了任何满足幺半群定律的单位元和二元运算都会形成一个幺半群。答案还显示了 JavaScript 中的一个函数 monoid 的示例。链接的 Wikipedia 表也显示了形成幺半群的其他配对。我猜你的问题标题是错误的,或者你不明白你在问什么。
  • 好吧,我写了一本关于函数式编程的书,由日本的一家主要出版公司出版。所以,我知道我在说什么。该问题通过示例引用了特定的 Monoid,并且标题与之相对应。我很了解 Monoid,而不是在这里问我也很了解的 Monoid Law 等。您的回答是不敬的,因为它与问题不符。对不起。
  • 你很快就会驳回别人并坚持自己。我可以看出你对自己的资历感到非常自豪,这可能是一个错误。您是否费心查看提供帮助的人的凭据? Bergi 是 SO 上关于此主题的最博学的贡献者之一;也有耐心和尊重。你似乎很清楚自己想要什么,所以我让你自己去寻找。
  • 重点是我的问题已经解决了。这是问答网站。我也没有禁止回答自己的问题。也许你也调查一下你的行为说“你的问题标题是错误的”是个好主意,事实是没有错的具体例子和定义。在您的答案中简单明了的“内同态单体”或身份功能在这里超出了主题。
【解决方案2】:

重要的是要知道能够组合事物并不一定意味着它们是幺半群。要成为 Monoid,它必须具有关联性、左身份和右身份。

C#:

public static Func<Guid, int> Combine(
    Func<Guid, int> f,
    Func<Guid, int> g)
{
    return x => f(x) + g(x);
}

JS:

function combine(f,g) {
    return x => f(x) + g(x)
}

function addOne(x) {
  return x + 1;
}

function addTwo(x) {
  return x + 2;
}

let newFunction = combine(addOne, addTwo);
let result = newFunction(0);
console.log(result)

【讨论】:

  • 谢谢,我可能不应该只问combine 操作,因为这至少没有意义,是的,它会产生错误。请在 S.O.Snippet 中使用小型工作代码。
  • combine 是一个接受两个参数的函数,在这种情况下这些参数被假定为函数。 combine 实际上会返回一个带有一个参数的新函数。在这个新函数中,每个参数 fg 将应用于 x 并将它们的结果相加。我希望这会让它更容易理解。
猜你喜欢
  • 1970-01-01
  • 2016-03-08
  • 2013-05-06
  • 2017-11-05
  • 2011-01-27
  • 2011-12-31
  • 2020-05-26
  • 2016-04-13
  • 2016-08-28
相关资源
最近更新 更多