【发布时间】:2016-11-02 14:05:09
【问题描述】:
这是一个生成所有排列的简单代码,基于此处找到的实现:All permutations of a list
let concatElement element sequence =
seq {
yield element
yield! sequence
}
let rec permute (choices : 'a seq)=
seq {
if Seq.isEmpty choices then
yield Seq.empty
else
for choice in choices do
let remaining = choices |> Seq.where (fun el -> el <> choice)
yield concatElement choice (permute remaining)
}
我在"yield concatElement choice (permute remaining)" 上收到一个编译时错误“当统一 ''a' 和 'seq' 时,结果类型将是无限的”
这里有什么问题?
【问题讨论】:
-
返回类型应该是什么?假设它应该是
seq<seq<'a>>,您需要最后一行concatElement的第一个参数是seq<'a>,但choice是'a。 -
concatElement 只是将一个元素附加到一个序列并返回 seq,因此 yield concatElement 应该产生一个 seq,结果会产生 seq
>。我错过了什么?或者也许我应该传递一个“头”并连接两个序列? -
如果
permute返回一个seq<seq<'a>>,那么concatElement choice (permute remaining)试图连接一个'a和一个seq<seq<'a>>,这是一个类型错误。如果您向permute添加显式返回类型,您可能会收到更有用的错误消息。 -
我引用了另一个实现,但完全忽略了嵌套循环。为我感到羞耻。我更愿意将其更改为尾递归,但这似乎并不简单
标签: f#