Вопрос:

Простые бессмысленные функции в Рамде

javascript ramda.js

27 просмотра

2 ответа

2543 Репутация автора

Я все еще изучаю Рамду и часто испытываю трудности с преобразованием, казалось бы, простых функций лямды в чистые функции Рамды без точек. Вот простой пример:

export const consoleTap = arg =>
  R.compose(
    R.tap,
    R.curryN(2, console[arg])
  );

export const errorTap = consoleTap("error");
export const logTap = consoleTap("log");

// example usage
R.map(logTap("Value"))([1, 2]) // Results in printing "Value 1" "Value 2"

Функции работают нормально, и я даже написал тесты для них. Я просто чувствую, что consoleTap может быть написан бессмысленно, и есть что-то, что я не вижу или не понимаю правильно. Можно ли переписать функцию?

Автор: Michael Pratt Источник Размещён: 10.08.2019 06:01

Ответы (2)


0 плюса

3733 Репутация автора

Я не мог придумать бессмысленную версию, которая не выглядела слишком сложной. Я думаю, то, что у вас есть, уже довольно хорошо.

Единственное, что я хотел бы сделать, это разделить вещи на части: отделить журнал от tap. Вы можете использовать свою «префиксную» версию журнала самостоятельно:

const logWith = (method, prefix) => curryN(2, console[method])(prefix);
const log = logWith('log', 'INFO: ');
const error = logWith('error', 'ERR: ');
log(10); // INFO: 10
error(10); // ERR: 10

и с tap:

const logTap = tap(logWith('error', 'ERR: '));
logTap(10);
// ERR: 10
// => 10

Автор: customcommander Размещён: 11.08.2019 08:45

0 плюса

7756 Репутация автора

Проблема, с которой вы R.tapстолкнулись, связана с тем, что вы не вариадны.

// tap is a unary function
const log = R.tap(console.log);

// logs only `1`
log(1, 2, 3, 4);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js" integrity="sha256-xB25ljGZ7K2VXnq087unEnoVhvTosWWtqXB4tAtZmHU=" crossorigin="anonymous"></script>

Таким образом, вы не можете сделать log('Value is, 1), обходной путь может быть сгруппировать аргументы для нажатия с R.unapplyи затем применить их обратно к регистратору черезR.apply


Простым решением может быть вызов R.tapпосле предоставления префикса регистратору:

const logger = R.pipe(
  R.prop(R.__, console),
  R.curryN(2),
);

const error = logger('error');
const log = logger('log');

const result = R.map(
  R.tap(log('value is')),
)([1, 2]);

// tap didn't alter any item inside the functor.
console.log('result is', result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js" integrity="sha256-xB25ljGZ7K2VXnq087unEnoVhvTosWWtqXB4tAtZmHU=" crossorigin="anonymous"></script>


Автор: Hitmands Размещён: 12.08.2019 06:49
Вопросы из категории :
32x32