Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const concat = (x, y) => x.concat(y)
- const mconcat = (xs, empty) => xs.length ? xs.reduce(concat) : empty()
- const concatMap = (f, xs) => xs.reduce(
- (acc, x) => {
- const r = f(x)
- return (acc || r.empty()).concat(r)
- },
- null
- )
- const Sum = value => ({
- value,
- result: () => value,
- concat: y => Sum(value + y.value),
- empty: () => Sum.empty()
- })
- Sum.of = Sum
- Sum.empty = () => Sum(0)
- const Count = value => ({
- value,
- result: () => value,
- concat: y => Count(value + y.value),
- empty: () => Count.empty()
- })
- Count.of = () => Count(1)
- Count.empty = () => Count(0)
- const Mean = (sum, count) => ({
- sum,
- count,
- result: () => sum.value / count.value,
- concat: y => Mean(sum.concat(y.sum), count.concat(y.count)),
- empty: () => Mean.empty()
- })
- Mean.of = value => Mean(Sum(value), Count(1))
- Mean.empty = () => Mean(Sum.empty(), Count.empty())
- const Square = value => ({
- value,
- result: () => value,
- concat: y => Square(value + y.value),
- empty: () => Square.empty()
- })
- Square.of = x => Square(x * x)
- Square.empty = () => Square(0)
- const StdDev = (mean, square) => ({
- mean,
- square,
- result: () => Math.sqrt(mean.count.value * square.value - mean.sum.value * mean.sum.value) / mean.count.value,
- concat: y => StdDev(mean.concat(y.mean), square.concat(y.square)),
- empty: () => StdDev.empty()
- })
- StdDev.of = x => StdDev(Mean.of(x), Square.of(x))
- StdDev.empty = () => StdDev(Mean.empty(), Square.empty())
- mconcat([
- StdDev.of(600),
- StdDev.of(470),
- StdDev.of(170),
- StdDev.of(430),
- StdDev.of(300)
- ], StdDev.empty).result()
- // 147.xyz
- concatMap(StdDev.of, [600, 470, 170, 430, 300]).result()
- // Same
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement