【发布时间】:2019-11-20 00:34:27
【问题描述】:
我正在尝试编写一个简单的 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])。
我尝试修改 valueOf 和 inspect 但两者都不起作用。我怀疑${x} 调用了不同的方法,但我在互联网上找不到那个方法。我需要修改什么,以便 ${x} 为我的嵌套 Id monad 返回正确的字符串?
【问题讨论】:
-
你想在这里达到什么目的?
-
不应该
valueOf()返回x吗?否则似乎没有办法拆箱。 -
相关但不能解决您的问题:
Symbol.toStringTag
标签: javascript node.js functional-programming template-strings