簡體   English   中英

從第二個投影中包含空元素的元組列表中刪除 F#

[英]Removing from a list of a tuples that contains an empty element in the second projection F#

我需要學習對 Pair 類型進行模式匹配的正確方法:

let pairToBeFiltered = Ok ([(1,[]);(2,[3;4]);(5,[6;7;8]);(9,[]);(10,[])])

let filterEmpty (pair: int * int list) =
    match pair with
    | (x,y) when y <> [] -> (x,y) //This gives error because of incomplete pattern matching!

let filtering = List.map(filterEmpty) pairToBeFiltered

所需的 output:

Ok([(2,[3;4]);(5,[6;7;8])])

三個版本:

(* using match statement *)
module Version1 =
   let pairsToBeFiltered : Result<_, string> =
      Ok [(1,[]);(2,[3;4]);(5,[6;7;8]);(9,[]);(10,[])]

   let myWhere (pair : int * List<int>) =
      match pair with
      | _, [] -> false
      | _, _ -> true

   let myFilter l0 = l0 |> Result.map (List.filter myWhere)

   let result = pairsToBeFiltered |> myFilter


(* using lambda functions and List.isEmpty *)
module Version2 =
   let pairsToBeFiltered : Result<_, string> =
      Ok [(1,[]);(2,[3;4]);(5,[6;7;8]);(9,[]);(10,[])]

   let myFilter l0 =
      l0 
      |> Result.map (fun l1 -> 
            l1 |> List.filter (fun (_, l2) -> 
               l2 |> List.isEmpty |> not))

   let result = pairsToBeFiltered |> myFilter


(* shortening Version2 (point free style - take care, can be confusing)  *)
module Version3 =
   let pairsToBeFiltered : Result<_, string> =
      Ok [(1,[]);(2,[3;4]);(5,[6;7;8]);(9,[]);(10,[])]

   let myFilter = Result.map (List.filter (snd >> List.isEmpty >> not))

   let result = pairsToBeFiltered |> myFilter

這應該這樣做:

let pairsToBeFiltered = Ok ([(1,[]);(2,[3;4]);(5,[6;7;8]);(9,[]);(10,[])])

let filterEmpty pairs =
    List.where (fun (_, y) -> y <> []) pairs   // pattern match on pair occurs here

let filtering : Result<_, string> =
    pairsToBeFiltered
        |> Result.map filterEmpty

printfn "%A" filtering   // Ok [(2, [3; 4]); (5, [6; 7; 8])]

這里有很多問題:

  • 為了清楚起見,我修改filterEmpty以便它處理整個列表,而不是一對。 這是我們使用模式匹配應用過濾 function, List.where的地方。 (在您的代碼中,請注意帶有match表達式的List.map不會過濾任何內容。)
  • 由於您的列表包含在Result中,因此您需要通過Result.map將其解包以進行處理。 (由於您沒有指定'TError類型,我假設使用string來安撫編譯器。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM