我已经在 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
因为我想保持功能通用并且我不希望客户总是要为阵列克隆付出代价。
你会怎么做?