Я пытаюсь написать простую Id монаду, чтобы поиграть с ней и научиться.
Вот что я написал:
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
монады?