如何在F#中为结构定义一个ctor,它反过来调用结构的默认ctor

cit*_*kid 2 f# constructor struct

我们如何在F#中为不可变结构定义一个ctor,它只接受一些字段.或者,与C#相比,我们如何在f#中将结构清零(例如在下面的c#示例中调用this())?

C#

struct Point
{
    private readonly int _x;
    private readonly int _y;
    public Point(int x) : this() // Will zero the struct
    {
        _x = x;
    }
    public Point(int y) : this() // Will zero the struct
    {
        _y = y;
    }

}
Run Code Online (Sandbox Code Playgroud)

上面的Point(x)ctor通过调用this()将结构清零,然后设置单个字段.这就是我所追求的.以下示例被大大简化,问题是如何将结构归零然后只设置一个字段.

F#

type Point =
   struct 
      val X: float
      val Y: float

      new(x: float) = ? // how to zero out the struct and then set ONLY X ?

   end
Run Code Online (Sandbox Code Playgroud)

Tom*_*cek 5

您可以使用Point(x, 0.0)在结构中调用另一个构造函数:

type Point =
   struct 
      val X: float
      val Y: float
      new(x: float, y: float) = { X = x; Y = y }
      new(x: float) = Point(x, 0.0)
   end
Run Code Online (Sandbox Code Playgroud)

作为旁注,您还可以通过使用type具有该Struct属性的普通定义来声明结构.这当然是一种风格问题,但我更喜欢这种变体:

[<Struct>]
type Point =
  val X: float
  val Y: float
  new(x: float, y: float) = { X = x; Y = y }
  new(x: float) = Point(x, 1.0)
Run Code Online (Sandbox Code Playgroud)