Advertisement
Guest User

Untitled

a guest
Oct 27th, 2016
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.60 KB | None | 0 0
  1. const concat = (x, y) => x.concat(y)
  2. const mconcat = (xs, empty) => xs.length ? xs.reduce(concat) : empty()
  3. const concatMap = (f, xs) => xs.reduce(
  4. (acc, x) => {
  5. const r = f(x)
  6. return (acc || r.empty()).concat(r)
  7. },
  8. null
  9. )
  10.  
  11. const Sum = value => ({
  12. value,
  13. result: () => value,
  14. concat: y => Sum(value + y.value),
  15. empty: () => Sum.empty()
  16. })
  17. Sum.of = Sum
  18. Sum.empty = () => Sum(0)
  19.  
  20. const Count = value => ({
  21. value,
  22. result: () => value,
  23. concat: y => Count(value + y.value),
  24. empty: () => Count.empty()
  25. })
  26. Count.of = () => Count(1)
  27. Count.empty = () => Count(0)
  28.  
  29. const Mean = (sum, count) => ({
  30. sum,
  31. count,
  32. result: () => sum.value / count.value,
  33. concat: y => Mean(sum.concat(y.sum), count.concat(y.count)),
  34. empty: () => Mean.empty()
  35. })
  36. Mean.of = value => Mean(Sum(value), Count(1))
  37. Mean.empty = () => Mean(Sum.empty(), Count.empty())
  38.  
  39. const Square = value => ({
  40. value,
  41. result: () => value,
  42. concat: y => Square(value + y.value),
  43. empty: () => Square.empty()
  44. })
  45. Square.of = x => Square(x * x)
  46. Square.empty = () => Square(0)
  47.  
  48. const StdDev = (mean, square) => ({
  49. mean,
  50. square,
  51. result: () => Math.sqrt(mean.count.value * square.value - mean.sum.value * mean.sum.value) / mean.count.value,
  52. concat: y => StdDev(mean.concat(y.mean), square.concat(y.square)),
  53. empty: () => StdDev.empty()
  54. })
  55. StdDev.of = x => StdDev(Mean.of(x), Square.of(x))
  56. StdDev.empty = () => StdDev(Mean.empty(), Square.empty())
  57.  
  58. mconcat([
  59. StdDev.of(600),
  60. StdDev.of(470),
  61. StdDev.of(170),
  62. StdDev.of(430),
  63. StdDev.of(300)
  64. ], StdDev.empty).result()
  65. // 147.xyz
  66.  
  67. concatMap(StdDev.of, [600, 470, 170, 430, 300]).result()
  68. // Same
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement