だろうが、実装に基づいて、すべての順列を生成するための簡単なコードでは、ここで見つける:All permutations of a listのF# - 結果の型は、ここで無限のエラー
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)
}
私はコンパイル時にエラーが発生します「結果の型は次のようになり'a'と 'seq <' a> 'を統一すると無限になります"yield concatElement choice (permute remaining)"
ここで何が間違っていますか?
返品の種類は何ですか? 'seq>'であると仮定すると、最後の行の 'concatElement'の最初の引数は' seq <'a> 'になる必要がありますが、 'choice'は' a'です。 –
Lee
concatElementはシーケンスに1つの要素を追加し、シーケンス<'a>を返します。したがって、yield concatElementはseq <'a>を生成し、結果としてseq>が生成されます。私は何が欠けていますか?または、私は "頭"を渡し、2つのシーケンスを連結する必要がありますか? –
'permute'が' seq> 'を返した場合、' concatElement choice(permute remaining) 'はタイプエラーである' 'a'と' seq 'を連結しようとしています。 'permute'に明示的な戻り値の型を追加すると、より有用なエラーメッセージが出る可能性があります。 –
Lee