【发布时间】:2016-09-13 14:03:55
【问题描述】:
我一直在尝试使用 Ramda.js 使用无点方法将我的原始解决方案重构为 getPermutations() 函数。是否有可能进一步重构它,朝向无点风格。看来我刚刚弄得更大了。另外,当我运行测试时,当前重构版本中存在一个错误:TypeError: reduce: list must be array or iterable。
原解决方案:
// 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函数?这非常困难。 -
@AaditMShah,这是正确的。我希望以无点风格编写
permute函数。您的反馈会有所帮助。我不确定我是否遗漏了一些简单的东西,错误地/次优地看待问题,或者递归函数是否天生就难以重构为无点风格。感谢您的反馈! -
我同意它通常不值得重构为无点,特别是在不求助于定点组合器的情况下很难实现无点递归。但我不同意这个问题应该作为链接问题的副本关闭,它不是关于无积分的,没有提到库,没有谈论重构现有代码,事实上,只与此共享他们都想在 JS 中使用置换函数。这不会使它们重复。
标签: javascript recursion functional-programming pointfree ramda.js