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

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

如果我选择使用 Method 区分联合,那么事情会更简洁:

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

我相信在 F# 中使用记录类型时无法避免这种冗长。我对吗?

4

1 回答 1

6

记录非常类似于只有一个案例的有区别的联合。在某些情况下,我也更喜欢联合,因为它更容易使用。但是,记录有两个主要优点:

  • 它们为字段命名,这在一定程度上会导致冗长,但会使代码更加不言自明
    。如果字段数量较少,则可以使用元组或单例联合。

  • 它们允许您使用{ info with Name = "Tomas" }语法来克隆记录

如果您想获得记录的好处,但仍然使用简单的语法进行创建,那么您可以定义一个静态成员来构造您的记录:

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 回答