gpt4 book ai didi

c# - 在 C# 中定义 F# '**' 运算符

转载 作者:太空狗 更新时间:2023-10-29 21:17:50 24 4
gpt4 key购买 nike

我看到 F# 使用 ** 运算符来求幂,所以 2 ** 5 = 32。这与 C# 不同,在 C# 中,您可以选择在自定义类型中使用“^”运算符,但由于某些原因,内置数字类型未使用它。

但是如何在 C# 中实现 ** 运算符以用于 F# 项目?

如果我在 C# 中这样做:

public static Integer operator ^(Integer left, Integer right)
{
if (Integer.IsNaN(left) || Integer.IsNaN(right)) return NaN;
return left.RaiseToPower(right);
}

它编译得很好,我可以像使用“+”运算符一样使用它,但它们在 F# 中都不起作用:

let intgr3 = intgr1 ** intgr2

let intgr3 = intgr1 ^ intgr2

在 C# 中,这是行不通的:

public static Integer operator **(Integer left, Integer right)
{
if (Integer.IsNaN(left) || Integer.IsNaN(right)) return NaN;
return left.RaiseToPower(right);
}

那么如何在 C# 中定义与 ** 运算符等效的 F#?
谢谢。

最佳答案

正如我在评论中所说,C# 不允许您定义新的运算符,并且 ** 不是 C# 中的运算符。 ^ 是一个运算符,但它是逻辑 XOR 运算符,而不是求幂运算符。这给了我一个提示,即 F# 可能会将您的 C# 运算符转换为 native F#(^^^ 用于逻辑异或)。

因此,我创建了几个测试项目并使用您对 ^ 的定义,这是我在 F# 中找到的内容:

open CSLib // CSLib is the C# library

let ( ** ) (x : Integer) (y : Integer) = x.RaiseToPower y

let x = new Integer()
let y = new Integer()

let a = x ^ y // error
let b = x ^^^ y // compiles, but looks like XOR
let c = x ** y // compiles

您可以在 F# 中定义新的全局运算符,但是如果您希望它成为一个通用的库,这可能是 Not Acceptable 。

您可以通过在 C# 库的 Integer 类型中定义公共(public)静态方法 Pow 来定义用于 F# 的求幂运算符:

public static Integer Pow(Integer left, Integer right)
{
if (Integer.IsNaN(left) || Integer.IsNaN(right)) return NaN;
return left.RaiseToPower(right);
}

然后,您就可以在 F# 中直接使用它作为 **。我会注意到 C# 中的重载运算符不是惯用的,因此使用 Pow 方法对于 C# 用户来说似乎很自然。

关于c# - 在 C# 中定义 F# '**' 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18841355/

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