Functional programming 如何使用免费单子

Functional programming 如何使用免费单子,functional-programming,monads,monetjs,Functional Programming,Monads,Monetjs,我一直在研究免费monad,因为我读到它的一个用例是以无副作用的方式进行日志记录 我正试图用JavaScript和库来实现这一点 然而,文档是缺乏的,我不理解免费单子足够好,我自己搞清楚(我一直在尝试) 我已经研究了Haskell实现,但是我没有很好地阅读Haskell,而且方法的名称似乎也不相同,所以我遇到了麻烦 有没有人能给我一个简单的例子,说明免费monad是如何在JavaScript或与上述库匹配的伪代码中工作的 我觉得如果我能看到一个完整的例子,我会理解得更好 以下是来自Monet库的

我一直在研究免费monad,因为我读到它的一个用例是以无副作用的方式进行日志记录

我正试图用JavaScript和库来实现这一点

然而,文档是缺乏的,我不理解免费单子足够好,我自己搞清楚(我一直在尝试)

我已经研究了Haskell实现,但是我没有很好地阅读Haskell,而且方法的名称似乎也不相同,所以我遇到了麻烦

有没有人能给我一个简单的例子,说明免费monad是如何在JavaScript或与上述库匹配的伪代码中工作的

我觉得如果我能看到一个完整的例子,我会理解得更好

以下是来自Monet库的单元测试:


但它们对我帮助不大(因为它们是测试)。

以无副作用的方式进行日志记录通常是通过以下方式完成的:

const compose=(f,g)=>value=>f(g(value));
常量编写器=({log=[],value})=>({
flatMap:func=>{
常量映射=func(值);
回信作者({
log:log.concat(mapped.log),
值:mapped.value
});
},
日志
价值
});
Writer.of=value=>Writer({value});
Writer.log=entry=>value=>Writer({log:[entry],value});
常量{log,value}=Writer.of(-42.5)
.flatMap(撰写(Writer.of,Math.abs))
.flatMap(Writer.log(`abs`))
.flatMap(撰写(作者、数学、楼层))
.flatMap(Writer.log(`floor`));

log({log,value})
使用一个免费的单子,您可以建立不同层次的单子上下文,即不进行连接。作为该结构的使用者,您有责任定义组合的含义,或者换句话说,如何解释嵌套上下文。同样有趣的是:,。读了这篇文章,很遗憾,在FP领域,这些东西很难理解,但当你最终理解的时候,你认为这是愚蠢的基础,但是,你无法向其他任何人解释。。。我会努力在我的博客上做一个很好的解释