1

これを行う方法はありますか?

type EntryDetails = 
| ADetails of TypeADetails
| BDetails of TypeBDetails
| ...


type Entry = { A, B, C, ... Details:EntryDetails}

let filter (list:list<Entry>) myType = List.filter (fun x -> x.Details is myType)

myTypeをハードコードされたタイプではなく、パラメーターにしたいことに注意してください。

私はこれを試しましたが、明らかに機能しません:

let filterDetails (entry:Entry) detailType = match entry.Details with 
                                               | detailType -> true 
                                               | _ -> false
4

1 に答える 1

2

それはあなたの質問に対する正確な解決策ではありませんが、実装するのはかなり近くて簡単です - で部分的なアクティブパターンを使用するのはどうですかList.choose?

type EntryDetails =
    | ADetails of int
    | BDetails of byte
    | CDetails of string

type Entry = { Foo : unit; Bar : unit; Details : EntryDetails; }

module Patterns =
  let (|ADetails|_|) x =
      match x.Details with
      | ADetails _ -> Some x
      | _ -> None

  let (|BDetails|_|) x =
      match x.Details with
      | BDetails _ -> Some x
      | _ -> None

  let (|CDetails|_|) x =
      match x.Details with
      | CDetails _ -> Some x
      | _ -> None

module internal Test =
    let private testData =
        let baseData = { Foo = (); Bar = (); Details = ADetails 0; }
        [   { baseData with Details = ADetails 10; };
            { baseData with Details = BDetails 7uy; };
            { baseData with Details = BDetails 92uy; };
            { baseData with Details = ADetails 32; };
            { baseData with Details = CDetails "foo"; };
            { baseData with Details = BDetails 2uy; };
            { baseData with Details = ADetails 66; };
            { baseData with Details = CDetails "bar"; };
            { baseData with Details = CDetails "baz"; }; ]

    let results =
        testData
        |> List.choose Patterns.(|ADetails|_|)

そのコードを に貼り付けるとfsi、次の出力が得られるはずです。

(* Snip ... removed irrelevant type signatures *)
module internal Test = begin
  val private testData : Entry list =
    [{Foo = null;
      Bar = null;
      Details = ADetails 10;}; {Foo = null;
                                Bar = null;
                                Details = BDetails 7uy;};
     {Foo = null;
      Bar = null;
      Details = BDetails 92uy;}; {Foo = null;
                                  Bar = null;
                                  Details = ADetails 32;};
     {Foo = null;
      Bar = null;
      Details = CDetails "foo";}; {Foo = null;
                                   Bar = null;
                                   Details = BDetails 2uy;};
     {Foo = null;
      Bar = null;
      Details = ADetails 66;}; {Foo = null;
                                Bar = null;
                                Details = CDetails "bar";};
     {Foo = null;
      Bar = null;
      Details = CDetails "baz";}]

  val results : Entry list =
    [{Foo = null;
      Bar = null;
      Details = ADetails 10;}; {Foo = null;
                                Bar = null;
                                Details = ADetails 32;};
     {Foo = null;
      Bar = null;
      Details = ADetails 66;}]
end

ご覧のとおり、Test.resultsリストはフィルター処理されているため、フィールドが typeのEntry項目のみが含まれています。DetailsADetails

于 2012-07-26T11:53:05.280 に答える