Chcę wyodrębnić pojedynczy element z sekwencji w F # lub podać błąd, jeśli nie ma go lub jest więcej niż jeden. Jaki jest najlepszy sposób na zrobienie tego?Wyodrębnij pojedynczy element z listy w F #
Obecnie mam
let element = data |> (Seq.filter (function | RawXml.Property (x) -> false | _ -> true))
|> List.of_seq
|> (function head :: [] -> head | head :: tail -> failwith("Too many elements.") | [] -> failwith("Empty sequence"))
|> (fun x -> match x with MyElement (data) -> x | _ -> failwith("Bad element."))
wydaje się działać, ale jest to naprawdę najlepszy sposób?
Edit: Jak już wskazano we właściwym kierunku, wpadłem na następujący:
let element = data |> (Seq.filter (function | RawXml.Property (x) -> false | _ -> true))
|> (fun s -> if Seq.length s <> 1 then failwith("The sequence must have exactly one item") else s)
|> Seq.hd
|> (fun x -> match x with MyElement (_) -> x | _ -> failwith("Bad element."))
myślę, że to trochę ładniejszy.
można podać sekwencję próbki i co szukasz? –
Nie uważam tego za konieczne. Chcę znaleźć pierwszą wartość i podać błąd, jeśli jest więcej niż jeden. To jest to – erikkallen
+1 - potrzebujesz odpowiednika F # do użytecznego operatora LINQ (System.Linq.Enumerable.Single) - normalnie jest odwrotnie! –