F# で標準の変更可能なインプレース順列アルゴリズムを実装しました (同様のことを行う組み込みの方法があれば、情報に感謝します)。
let permutations f (alphabet:'a array) =
let swap i j =
let aux = alphabet.[i]
alphabet.[i] <- alphabet.[j]
alphabet.[j] <- aux
let rec permutations' n =
if n = alphabet.Length
then f alphabet
else
for i in n..(alphabet.Length-1) do
swap n i
permutations' (n+1)
swap n i
permutations' 0
関数は非常に用途が広いですが、検出されたアイテムをシーケンスとして生成するラッパー関数を F# に実装する方法があるかどうか疑問に思っていました。次の (間違った) F# メソッドに似たもの:
let permutations_seq (alphabet:'a array) =
seq {
permutations (fun arr -> yield arr.Clone()) alphabet
}
permutations
関数を一般的に維持したいので、直接したくありません。またyield
、クライアントが常に配列のクローン作成の代償を払わなければならないことを望んでいません。
どのようにしますか?