Предположим, у меня есть следующие нечистые функции:Составление нечистые функции
// Mounts a foo instance into the given dom node
// (this is an implementation detail of the Foo library),
// then returns the foo instance.
const createFoo = (FooConstructor, domNode, options) => {
return new FooConstructor(domNode, options);
};
const outlineFoo = foo => {
foo.getCanvas().outline = true;
return foo;
}
Если бы я хотел использовать R.compose
создать экземпляр Foo и выделить его, я мог бы написать функцию, которая делает:
const createFooWithHighlights = (FooConstructor, domNode, options) => {
return R.compose(
outlineFoo,
createFoo
)(FooConstructor, domNode, options)
}
Если бы я хотел использовать императивное программирование для достижения того же, я бы сделал:
const createFooWithHighlights = (FooConstructor, domNode, options) => {
const foo = createFoo(FooConstructor, domNode, options);
outlineFoo(foo);
return foo;
}
Какой бы ни один мы выбрали, она будет вызвана тем же:
const highlightedFooInDOM = createFooWithHighlights(Foo, document.body, {})
Поскольку все эти функции вызывают побочные эффекты, следует избегать использования R.compose
? Существуют ли правила, регулирующие чистоту и функциональный состав?
Вы должны прочитать о IO monad – naomik