Я пытаюсь реорганизовать свое исходное решение на функцию getPermutations(), используя точечный подход с использованием Ramda.js. Можно ли реорганизовать его дальше, в сторону бесшумного стиля. Похоже, я просто сделал еще больший беспорядок. Кроме того, при запуске тестов в исправленной версии есть ошибка: TypeError: reduce: list должен быть массивом или итерируемым.Рефакторинг getPermutations() строки, использующей рекурсию, Ramda.js и стиль без точек
Оригинальное решение:
// getPermutations :: String -> [String]
function getPermutations(string) {
function permute(combination, permutations, s) {
if (!s.length) {
return permutations[combination] = true;
}
for (var i = 0; i < s.length; i++) {
permute(combination.concat(s[i])
, permutations
, (s.slice(0, i) + s.slice(i+1))
);
}
return Object.keys(permutations);
}
return permute('', {}, string);
}
Моя попытка реорганизовать с Ramda.js:
var _ = require('ramda');
// permute :: String -> {String: Boolean} -> String -> [String]
var permute = _.curry(function (combination, permutations, string) {
// callPermute :: String -> ({String: Bool} -> Char -> Int -> String) -> IO
var callPermute = function (combination) {
return function (acc, item, i, s) {
return permute(_.concat(combination, item)
, acc
, _.concat(_.slice(0, i, s), _.slice(i + Infinity, s))
);
};
};
var storeCombination = function() {
return permutations[combination] = true;
};
// should be an ifElse, incorporating compose below
_.when(_.not(string.length), storeCombination);
return _.compose(_.keys
, _.addIndex(_.reduce(callPermute(''), {}))
) (string.split(''));
});
// getPermutations :: String -> [String]
var getPermutations = permute('', {});
На ваш вопрос? Вы просто хотите написать функцию 'permute' в стиле point-free? Это очень сложно. –
@AaditMShah, это правильно. Я надеялся написать функцию 'permute' в стиле point-free. Ваши отзывы помогают. Я не был уверен, что я пропустил что-то простое, неправильно рассмотрев проблему/не оптимально, или если рекурсивные функции по своей сути трудно реорганизовать в бесконтактный стиль. Спасибо за ответ! – Eric
Я согласен с тем, что часто не стоит рефакторинга на бесплатные очки, особенно трудно добиться безотказной рекурсии, не прибегая к комбинатору с фиксированной запятой. Но я не согласен с тем, что эти вопросы должны быть закрыты как дубликат связанного вопроса, который не касался бесплатных точек, не упоминал библиотеку, не говорил о реорганизации существующего кода и, по сути, только делился с этим что они оба хотели функцию перестановки в JS. Это не делает их дублирующими. –