1
let private GetDrives = seq{
let all=System.IO.DriveInfo.GetDrives()
for d in all do
    //if(d.IsReady && d.DriveType=System.IO.DriveType.Fixed) then
        yield d
}

let valid={'A'..'Z'}
let rec SearchRegistryForInvalidDrive (start:RegistryKey) = seq{
    let validDrives=GetDrives |> Seq.map (fun x -> x.Name.Substring(0,1))
    let invalidDrives= Seq.toList validDrives |> List.filter(fun x-> not (List.exists2 x b)) //(List.exists is the wrong method I think, but it doesn't compile

私はF#: Filter items found in one list from another listに従いましたが、表示される両方のソリューションがコンパイルされていないように見えるため、問題に適用できませんでした。List.Contains は存在せず (参照がありませんか?)、ListA - ListB もコンパイルされません。

4

2 に答える 2

7
open System.IO
let driveLetters = set [ for d in DriveInfo.GetDrives() -> d.Name.[0] ]
let unused = set ['A'..'Z'] - driveLetters
于 2012-04-11T21:56:31.927 に答える
3

あなたの最初のエラーは と の間で混ざっcharstringcharます。

let all = {'A'..'Z'}
let validDrives = GetDrives |> Seq.map (fun x -> x.Name.[0])

現在、無効なドライブ文字は、含まれているが含まれてallいない文字validDrivesです。

let invalidDrives = 
      all |> Seq.filter (fun c -> validDrives |> List.forall ((<>) c))

validDrivesメンバーシップを確認するために何度もトラバースされるため、この例ではセットに変換する方が適切です。

let all = {'A'..'Z'}
let validDrives = GetDrives |> Seq.map (fun x -> x.Name.[0]) |> Set.ofSeq
let invalidDrives = all |> Seq.filter (not << validDrives.Contains)
于 2012-04-11T22:05:44.780 に答える