Каррирование часто используют в функциональном программировании, когда вендорный код или какой-либо модуль входным параметром принимает функцию и передает в нее свои аргументы, которые вы можете использовать, но при этом хотите передать туда свои:
const foo = myArg => (interfaceArg1, interfaceArg2) => {
// do something
};
vendor(foo(someValue));
Каррирование часто используют для написания промежуточного ПО.
app.use(express.static('./puplic'));
Понятное дело, что промежуточное ПО static реализовано с использованием каррирования.
Еще пример с использованием библиотеки StyledComponents(не самый простой, конечно):
const buildMediaByConditionFn = conditionFn => (...args) => props => conditionFn(props) && css(...args);
const mobile = buildMediaByConditionFn(props => props.device.isMobile);
const desktop = buildMediaByConditionFn(props => !props.device.isMobile);
const media = {
mobile,
desktop,
};
export default media;
Код выше позволит нам писать, вместо:
const Element = styled.div`
${props => props.device.isMobile && css`
position: fixed;
`}
`;
так:
const Element = styled.div`
${media.mobile`
position: fixed;
`}
`;
Конструкция будет использоваться часто, а вся реализация при этом скрыта. Так же, снижена когнитивная нагрузка с человека сопровождающего код. Поэтому использование такого подхода очень разумно.
Если вы пишите простые функции, которые хотите затем использовать, то пишите несколько аргументов. Нет особого смысла переписывать это:
const square = (width, height) => height * width;
В это:
const square = width => height => height * width;