8

我想在 F# 中编写这个 C# 的等价物:

struct Vector2 {
    public readonly int X;
    public readonly int Y;
    public Vector2(int x, int y) {
        X = x;
        Y = y;
    }
}

这迫使用户提供参数来创建实例[编辑:这对于值类型是错误的 - 所有值类型都有一个默认构造函数]。也可以为默认 Vector2 提供静态只读字段,即 Vector2.Zero。

看起来获取公共字段的唯一方法是通过“val”关键字,但似乎不允许我使用默认构造函数初始化它们,而且我不想有两个构造函数:

  [<Struct>]
  type MyInt(value) =
        val public Value : int = value;;

          val public Value : int = value;;
  -------------------------------^

stdin(7,32): error FS0010: Unexpected symbol '=' in member definition

我知道这可以通过成员绑定来完成,但是如果我理解的话,这会创建属性,而不是字段。

4

2 回答 2

6

根据这个http://msdn.microsoft.com/en-us/library/vstudio/dd233233.aspx,可以这样做

type Vector2 =
   struct 
      val public X: int
      val public Y: int
      new(x: int, y: int) = { X = x; Y = y }
   end
于 2013-08-08T19:36:28.533 回答
2

如果 F#记录对您有用,那么这将起作用:

type MyInt = {
    Value: int
};;

然后初始化:

let i = {Value=1};;

由于我不完全确定您的用例,因此我不确定这有多大帮助。

编辑:对于它的价值,如果您偏爱值类型的原因是您想要值类型相等语义,则记录支持(即使它们是引用类型)。考虑一下:

type Vector2 = {
     X:int;
     Y:int
};;

type Vector2 =
  {X: int;
   Y: int;}

let v = {X=1;Y=1};;

val v : Vector2 = {X = 1;
                   Y = 1;}

let v2 = {X=1;Y=1};;

val v2 : Vector2 = {X = 1;
                    Y = 1;}

v = v2;;
val it : bool = true

let v3 = {X=2;Y=2};;
v = v3;;
val it: bool = false

我的意思是说,即使记录是引用类型,人们使用值类型(相等语义)的原因之一并不是记录的问题。尽管它是一种引用类型,但我相信它更接近您试图模拟的 C# 代码的行为——因为它的价值。

于 2013-08-08T19:56:25.473 回答