如何使用免费Monad

时间:2018-03-13 17:25:35

标签: functional-programming monads monetjs

我一直在研究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

但他们对我帮助不大(因为他们是考试)。

1 个答案:

答案 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 })