2
let Method = { Name:string } //oversimplification

let method_parser =
  spaces >>. many1Satisfy isLetter .>> spaces
  |>> (fun name -> { Name=name })

代わりに、メソッド判別共用体を使用することを選択した場合、物事はもう少し簡潔になります。

let method_parser =
  spaces >>. many1Satisfy isLetter .>> spaces
  |>> Method

F# でレコード型を使用する場合、この種の冗長性を回避する方法はないと思います。私は正しいですか?

4

1 に答える 1

6

レコードは、ケースが 1 つのみの判別共用体に非常に似ています。場合によっては、ユニオンの方が使いやすいので、ユニオンも好みます。ただし、レコードには次の 2 つの主な利点があります。

  • それらはフィールドに名前を付けます。これにより、部分的に冗長になりますが、コードがより自明になり
    ます フィールドの数が少ない場合は、タプルまたは単一ケースのユニオンを使用できます。

  • { info with Name = "Tomas" }レコードを複製するための構文を使用できます。
    これが必要ない場合は、標準の F# クラス (より .NET に近い) を使用できます。

レコードのメリットを享受したいが、作成に単純な構文を使用したい場合は、レコードを構築するための静的メンバーを定義できます。

type Info = 
  { Name : string 
    Count : int }
  static member Create(name:string, count:int) = 
    { Name = name; Count = count }

次に、次のように記述できます。

// Simple example using the above type:
let res = ("hello", 5) |> Info.Create

// I expect this would work for your type like this:
let method_parser = 
   spaces >>. many1Satisfy isLetter .>> spaces 
   |>> Method.Create
于 2011-08-24T22:44:21.060 に答える