我一直試圖使用Ramda.js使用無點方法將我的原始解決方案重構爲getPermutations()函數。是否有可能進一步重構它,朝着一種無點風格的方式進行重構。看起來我只是做了一個更大的混亂。此外,當我運行測試時,重構版本中存在一個錯誤:TypeError:reduce:list必須是數組或可迭代的。使用遞歸,Ramda.js和無點式重構getPermutations()
原來的解決方案:
// 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'函數。您的反饋有幫助。我不確定我是否錯過了簡單的東西,錯誤地/次優地看待問題,或者如果遞歸函數本身很難重構爲無點式樣。感謝您的反饋! – Eric
我同意通常不值得重構爲無點,特別是難以實現無點遞歸而不使用定點組合器。但我不同意這個問題應該作爲與無關的鏈接問題的副本來結束,沒有提到一個庫,也沒有談論重構現有代碼,實際上只是與這個共享一個他們都想要JS中的置換函數。這並不會使它們重複。 –