在JavaScript的例子中,Function Monoids的二元运算符是什么

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (29)

本文中,函数Monoids与C#代码和Haskell类型定义一起引入。

a -> b如果b是幺半群,则函数是幺半群。这意味着您可以组合两个具有相同类型的函数。在面向对象的上下文中,这意味着只要返回类型形成一个monoid,就可以将具有相同签名的两个方法组合到一个方法中。 概括 虽然上面的C#代码只是一个例子,但一般规则是任何返回monoid的函数本身都是一个monoid。在Haskell中,此规则在标准库中明确表达: instance Monoid b => Monoid (a -> b) 这意味着对于任何幺半群b,函数a -> b也(自动)为幺半群。

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

JavaScript中用于实现此函数Monoids的示例代码是什么?

cf) 为什么instance Monoid b => Monoid (a -> b)在基地?

提问于
用户回答回答于

重要的是要知道能够结合事物并不一定意味着它们是幺半群。对于像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 (identity, a) == combine (a, identity) 相关性法则: combine (a, combine (b, c)) == combine (combine (a, b), c)

我们可以为函数实现identity elementidentity)和binary operationcombine) -

// 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上的表。

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

扫码关注云+社区

领取腾讯云代金券