gpt4 book ai didi

f# - 为什么 F# 编译器会因为这个中缀运算符而失败?

转载 作者:行者123 更新时间:2023-12-04 02:19:09 26 4
gpt4 key购买 nike

我有一个类和一个像这样定义的记录:

namespace Foo
type internal MyRecord =
{
aValue1 : int
aValue2 : int
}
static member (+) (left : MyRecord, right : MyRecord) : MyRecord =
{aValue1 = left.aValue1 + right.aValue1; aValue2 = left.aValue2 + right.aValue2;}

type internal Bar() =
member this.Baz() =
let myRecord1 = {aValue1 = 2; aValue2 = 3;}
let myRecord2 = {aValue1 = 7; aValue2 = 5;}
let sum = myRecord1 + myRecord2 //Does not compile
0

这无法编译:

The member or object constructor 'op_Addition' is not public. Private members may only be accessed from within the declaring type. Protected members may only be accessed from an extending type and cannot be accessed from inner lambda expressions.



这两种类型都是内部的。如果我明确设置 +运营商公开,这也无济于事:

static member public (+) (left : MyRecord, right : MyRecord) : MyRecord

什么工作只是放弃使用运算符并使用静态方法:

namespace Foo
type internal MyRecord =
{
aValue1 : int
aValue2 : int
}
static member Add (left : MyRecord, right : MyRecord) : MyRecord =
{aValue1 = left.aValue1 + right.aValue1; aValue2 = left.aValue2 + right.aValue2;}

type internal Bar() =
member this.Baz() =
let myRecord1 = {aValue1 = 2; aValue2 = 3;}
let myRecord2 = {aValue1 = 7; aValue2 = 5;}
let sum = MyRecord.Add(myRecord1, myRecord2) //Does compile
0

为什么 F# 编译器在使用命名成员工作正常时在这种情况下难以使用运算符?

将这两种类型更改为 public 而不是 internal 也可以解决编译错误。

我将 Visual Studio 2012 与面向 .NET Framework 3.5 的 F# 3.0 结合使用。

最佳答案

我不知道为什么 F# 编译器会出现这个问题。这可能与 F# 中处理运算符的方式或可访问性的处理方式有关。您必须记住,在这种语言中,并非一切都像它看起来的那样。通过做出一些牺牲,已经实现了一些“面向对象”的特性。也许这就是其中之一。

但。我知道如何解决这个问题:)。不要在实现文件中使您的类型成为内部类型。而是使用签名。像这样定义文件 Foo.fsi:

namespace Foo
type internal MyRecord =
{
aValue1 : int
aValue2 : int
}

[<Class>]
type Bar =
member Baz : unit -> int

和 Foo.fs 像这样:
namespace Foo
type MyRecord =
{
aValue1 : int
aValue2 : int
}
static member (+) (left : MyRecord, right : MyRecord) : MyRecord =
{aValue1 = left.aValue1 + right.aValue1; aValue2 = left.aValue2 + right.aValue2;}

type Bar() =
member this.Baz() =
let myRecord1 = {aValue1 = 2; aValue2 = 3;}
let myRecord2 = {aValue1 = 7; aValue2 = 5;}
let sum = myRecord1 + myRecord2 //Compiles
0

这使您的代码有效并且 MyRecord内部的。

关于f# - 为什么 F# 编译器会因为这个中缀运算符而失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17475607/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com