[Compose] 8. A curated collection of Monoids and their uses
2024-08-26 17:33:48
const { List } = require('immutable-ext'); const Right = x => ({
chain : f => f(x),
ap : other => other.map(x),
traverse : (of, f) => f(x).map(Right),
map : f => Right(f(x)),
fold : (f, g) => g(x),
concat : o => o.fold(_ => Right(x), y => Right(x.concat(y))),
toString : () => `Right(${x})`
}) const Left = x => ({
chain : f => Left(x),
ap : other => Left(x),
traverse : (of, f) => of(Left(x)),
map : f => Left(x),
fold : (f, g) => f(x),
concat : o => o.fold(_ => Left(x), y => o),
toString : () => `Left(${x})`
}); const fromNullable = x => x != null ?
Right(x) :
Left(null); const tryCatch = f => {
try {
return Right(f())
}
catch( e ) {
return Left(e)
}
}; let stats = List.of({
page : 'Home',
view :
}, {
page : 'About',
view :
}, {
page : 'Help',
view :
}); const Sum = x => ({
x,
concat : ({ x: y }) => Sum(x + y),
toString : () => `Sum(${x})`
});
Sum.empty = () => Sum(); const res = stats.foldMap(x => fromNullable(x.view)
.map(Sum), Right(Sum()));
console.log(res.toString()); // Right(Sum(54))
If change the data a litte bit:
let stats = List.of({
page : 'Home',
view :
}, {
page : 'About',
view :
}, {
page : 'Help',
view : null
}); const Sum = x => ({
x,
concat : ({ x: y }) => Sum(x + y),
toString : () => `Sum(${x})`
});
Sum.empty = () => Sum(); const res = stats.foldMap(x => fromNullable(x.view)
.map(Sum), Right(Sum()));
console.log(res.toString()); // Right(Sum(50))
Because the view: null, then it will skip .map(sum).
最新文章
- CS193P学习笔记(一)
- Axis2 webservice入门--写个简单的webservice
- 3640: JC的小苹果 - BZOJ
- android UI进阶之实现listview的下拉加载
- 关于C#虚函数和构造函数的一点理解
- Codeforces 163A Substring and Subsequence
- php之手机号码查归属地
- pyqt tabWidget例子学习1
- python之log
- IDEA调用其它模块module的类方法
- Linux网络编程目录
- IEnumerable 与 IEnumerable<;T>;
- webpack常用loader和plugin及打包速度优化
- python内置函数整理
- phpmyadmin无法访问503错误的解决方法
- php基础-5
- MySQL查询数据表的Auto_Increment(自增id)
- python学习笔记(十一)之序列
- Codeforces Round #114 (Div. 1) E. Wizards and Bets 高斯消元
- 源码安装redis初始化实例脚本