我一直在研究Free monad,因为我已经读过它的一个用例是以无副作用的方式进行日志记录。
我正在尝试使用Monet库在JavaScript中执行此操作。
然而,文档缺乏,我不明白Free the monad能够自己解决(我一直在尝试)。
我已经研究过Haskell实现,但是我没有很好地阅读Haskell,并且这些方法看起来并没有相同,所以我遇到了麻烦。
有人可以给我一个简单的例子,说明Free monad如何在与上述库匹配的JavaScript或伪代码中工作?
我觉得如果我能看到一个完整的例子,我会更好地理解。
以下是Monet图书馆的单元测试:https://github.com/monet/monet.js/blob/develop/test/free-spec.js
但他们对我帮助不大(因为他们是考试)。
答案 0 :(得分:0)
以无副作用的方式记录日志通常使用Writer Monad:
const compose = (f, g) => value => f(g(value));
const Writer = ({ log = [], value }) => ({
flatMap: func => {
const mapped = func(value);
return Writer({
log: log.concat(mapped.log),
value: mapped.value
});
},
log,
value
});
Writer.of = value => Writer({ value });
Writer.log = entry => value => Writer({ log: [entry], value });
const { log, value } = Writer.of(-42.5)
.flatMap(compose(Writer.of, Math.abs))
.flatMap(Writer.log(`abs`))
.flatMap(compose(Writer.of, Math.floor))
.flatMap(Writer.log(`floor`));
console.log({ log, value })