javascript - 如何更改模板字符串推断的值

标签 javascript node.js functional-programming template-strings

我正在尝试编写一个简单的 Id monad 来玩耍和学习。

这是我写的:

const util = require('util');

const Id = x => ({
  [util.inspect.custom]: () => `Id(${x})`,
  map: f => Id.of(f(x)),
  flatMap: f => f(x),
  valueOf: () => `Id(${x})`,
});

Id.of = Id;

const foo = Id.of('foo');
const toUpper = str => Id.of(str.toUpperCase());

const fooBoxed = foo.map(toUpper); // Oh oh, should be Id(Id('FOO'));
const FOO = foo.flatMap(toUpper); // Yay, Id('FOO');

console.log(fooBoxed);
console.log(FOO);

fooBoxed 应该注销 Id(Id(Foo)),但它却注销 Id([object object])。 我尝试修改 valueOfinspect 但两者都不起作用。我怀疑 ${x} 调用了不同的方法,但我在互联网上找不到那个方法。我必须修改什么才能让 ${x} 返回嵌套 Id monad 的正确字符串?

最佳答案

您需要覆盖toString,而不是valueOf。连接字符串(或插入模板字符串)会将值强制转换为字符串,并且您的对象继承 Object.prototype.toString ,它返回 [object …]

const Id = x => ({
  toString: () => `Id(${x})`,
  map: f => Id.of(f(x)),
  flatMap: f => f(x),
});

Id.of = Id;

const foo = Id.of('foo');
const toUpper = str => Id.of(str.toUpperCase());

const fooBoxed = foo.map(toUpper);
const FOO = foo.flatMap(toUpper);

console.log(fooBoxed.toString()); // Yay, Id(Id('FOO'));
console.log(FOO.toString()); // Yay, Id('FOO');

但是,由于您似乎打算使用它进行调试,因此您实际上应该使用 x 值的调试表示形式。为此,请调用util.inspect()你自己:

const util = require('util');

const Id = x => ({
  [util.inspect.custom]: () => `Id(${util.inspect(x)})`,
//                                   ^^^^^^^^^^^^
  map: f => Id.of(f(x)),
  flatMap: f => f(x),
  valueOf: () => x,
});
Id.of = Id;

关于javascript - 如何更改模板字符串推断的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56969737/

相关文章:

javascript - 如何使用 Javascript 开发此功能?

node.js - NodeJS : Process has been killed unexpectedly

Node.js、Express 和 Postgres 设计

python - flatMap 还是在 Python 3 中绑定(bind)?

f# - 柯里化(Currying)和多重积分

javascript - 如何设置图像对象在特定步骤后停止移动

javascript - 将 javascript 对象关联到 SVG 元素

javascript - 当我用 Javascript 向下滚动结果时,我的代码出了什么问题

javascript - Nodejs如何在回调函数之外访问一个tcp套接字

syntax - 为什么 Scala 有时会自动应用 thunk?