RamDA.jsを使用して、ポイントフリーの手法を使用して私のオリジナルの解をgetPermutations()関数にリファクタリングしようとしています。それをリファクタリングすることは、ポイントフリーのスタイルに向けてさらに可能ですか?私はちょうどさらに大きな混乱を作りました。また、現在、テストを実行するときにリファクタリングされたバージョンにバグがあります。TypeError:reduce:listは配列または反復可能でなければなりません。再帰、Ramda.jsおよびポイントフリースタイルを使用してStringの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);
}
私の試み:
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('', {});
どういうところですか? point-freeスタイルで 'permute'関数を書くだけですか?それは非常に難しいです。 –
@AaditMShah、それは正しいです。私はpoint-freeスタイルで 'permute'関数を書くことを望んでいました。あなたのフィードバックは役に立ちます。私は何かシンプルなものを見逃していたかどうか、問題を間違って/サブ最適に見ているのか、再帰関数がポイントフリーのスタイルにリファクタリングするのが本質的に難しいのか分かりませんでした。フィードバックをお寄せいただきありがとうございます! – Eric
私は、ポイントフリーのリファクタリング、特に固定小数点のコンビネータに頼らずにポイントフリーの再帰を達成することは難しいことによく同意します。しかし、私は、この質問が、ポイントフリーではなく、図書館に言及せず、既存のコードのリファクタリングについて話をしなかった、リンクされた質問の複製として閉じられるべきであることに同意しません。彼らは両方ともJSの置換関数を求めていました。それはそれらが重複することはありません。 –