在this article函数中,通过C#代码和Haskell类型定义引入了么半群。
如果
b
是么半群,则函数a -> b
是么半群。这意味着您可以组合两个相同类型的函数。在面向对象的上下文中,这意味着只要返回类型形成monoid,就可以将具有相同签名的两个方法组合成一个方法。
泛化
虽然上面的C#代码只是一个示例,但一般规则是,任何返回么半群的函数本身都是么半群。在Haskell中,此规则在标准库中明确表示:
实例么半群b =>么半群(a -> b)
这意味着对于任何么半群,函数a -> b
也(自动)是么半群。
问题是C#中的示例对"GUID“过于具体,我不知道作者试图在代码中做什么,而Haskell类型定义仅仅是类型定义。
用JavaScript实现这个函数Monoid的示例代码是什么?
发布于 2019-03-22 05:50:18
重要的是要知道,能够组合事物并不一定意味着它们是么半群。要成为么半群,它必须具有结合性、左单位和右单位。
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)
发布于 2019-03-22 07:00:58
同一性法则:
combine (identity, a) == combine (a, identity)
结合性定律:
combine (a, combine (b, c)) == combine (combine (a, b), c)
我们可以为函数实现身份元素(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上的表格。
当然,您并不局限于这些域。您的自定义类型可能具有满足么半群定律的各种二元运算和标识元素。如果法律得到支持,你的类型就属于么半群类别。
https://stackoverflow.com/questions/55289369
复制相似问题