次のコードブロックがあります。
let rec Sieve p nums =
let filtered = query { for n in nums do
where (n % p = 0 && n <> p)
select n } |> Seq.toList
if filtered = nums then filtered // Error
else
let nextIndex = 1 + (filtered |> List.findIndex (fun x -> x = p))
if nextIndex > filtered.Length then filtered
else
let next = filtered.[nextIndex]
Sieve next filtered
これをコンパイルすると、次のようになります。タイプ''リスト'は'System.Linq.IQueryable<'a> 'と互換性がありません。コメントエラーでマークした行。
Sieveに型注釈を追加してnums(nums:int list)にすると、正しく機能することがわかりました。しかし、行のnumsを置き換えると
if filtered = nums then filtered
と:
if filtered = [1..10] then filtered
次に、次の行でフィルタリングされたものを参照して同じエラーが発生します。
Sieve next filtered
フィルタリングされると、使用する前にリストに直接変換するので、なぜこのエラーが発生するのですか?