Функция капитализации в стиле без точек с помощью Ramda

#javascript #pointfree #ramda.js

#javascript #без точек #ramda.js

Вопрос:

При написании функции с капитализацией тривиально, так что:

«привет» => «Привет» «привет» => «Привет»

Как можно было бы написать ее, используя стиль без точек, используя Ramda JS?

https://en.wikipedia.org/wiki/Tacit_programming

Ответ №1:

Вы можете частично применить replace регулярное выражение, которое выполняется toUpper с первым символом:

const capitalize = R.replace(/^./, R.toUpper);

Комментарии:

1. Провел несколько быстрых и грязных тестов по предоставленным ответам, и ваш самый быстрый.

2. однако 2-й параметр replace — это строка, а не функция. У меня не работает

3. @DamianGreen Ramda реализует R.replace собственный строковый метод javascript. 2-й аргумент тоже может быть функцией, см. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /…

Ответ №2:

Это было бы что-то вроде этого:

 const capitalize = R.compose(
    R.join(''),
    R.juxt([R.compose(R.toUpper, R.head), R.tail])
);
  

Демонстрация (в ramdajs.com REPL).

И незначительные изменения для обработки null значений

 const capitalize = R.compose(
    R.join(''),
    R.juxt([R.compose(R.toUpper, R.head), R.tail])
);

const capitalizeOrNull = R.ifElse(R.equals(null), R.identity, capitalize);
  

Комментарии:

1. В качестве последующего вопроса, как бы вы обработали нулевой регистр при написании в стиле без точек? Если эта функция была вызвана с capitalize(null), она взорвется.

2. @TutanRamen добавьте к ней ifElse(equals(null), identity, , иначе я думаю, что именно здесь Maybe monad станет полезным.

3. Потрясающе! Можно даже вставить isNil вместо equals(null) now!

4. Комбинация ifElse identity может быть заменена, возможно, более читаемой unless функцией: const capitalizeIfNotNil = R.unless(R.isNil, capitalize);

Ответ №3:

Я предлагаю использовать R.lens :

 const char0 = R.lens(R.head, R.useWith(R.concat, [R.identity, R.tail]));

R.over(char0, R.toUpper, 'ramda');
// => 'Ramda'
  

Ответ №4:

Я собрал несколько быстрых и грязных тестов для всех, кто заинтересован. Похоже, что @lax4mike является самым быстрым из предоставленных ответов (хотя более простой, без точек str[0].toUpperCase() str.slice(1) намного быстрее [а также не то, о чем просил OP, так что это спорно]).

https://jsfiddle.net/960q1e31 / (Вам нужно будет открыть консоль и запустить скрипку, чтобы увидеть результаты)

Ответ №5:

Для тех, кто, достигнув этого, ищет решение, в котором первая буква пишется заглавными буквами, а остальные буквы — строчными, вот оно:

 const capitalize = R.compose(R.toUpper, R.head);
const lowercaseTail = R.compose(R.toLower, R.tail);
const toTitle = R.converge(R.concat, [capitalize, lowercaseTail]);

toTitle('rAmdA');
// -> 'Ramda'