[JS Compose] 7. Ensure failsafe combination using monoids

时间:2021-09-22 04:00:12

monoids is a semi-group with a neutral element. A semigroup, it does not have an element to return so it's not a safe operation, whereas with the monoids we could take as many as we possibly want, even none, and still return us back something. It's a perfectly safe operation here that we can reduce as many of them as we'd like.

For example to Sum():

const Sum = x =>
({
concat: o => Sum(x + o.x)
})

'Zero' neutral element for Sum semi-group, so Sum is monoids.

 +  //
+ //
x + //x

So we can define an interface for Sum:

Sum.empty = () => Sum()

And if we concat Sum.empty to anything, it won't affect the result:

Sum.empty().concat(Sum()) // Sum(1)

The same as All():

All.empty = () => All(true)

// true && true -->  true
// false && true --> false

But for the First(), we can not find a neutal element for it, because it just throw away the rest value only keep the first value and first value can be undefined.

[,,] && undefined -->
undefined && [,,] --> error

Monodis also looks like reduce:

const sum = xs =>
xs.reduce((acc, x) => acc + x, ) console.log(sum([,,])) // const all = xs =>
xs.reduce((acc, x) => acc && x, true) console.log(all([true, false])) //false const first = xs =>
xs.reduce((acc, x) => acc) console.log(first([,,]))
console.log(first([])) //Error