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

本文关键字:运算符 定义 | 更新日期: 2023-09-27 18:31:29

我看到 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# 中定义 F# '**' 运算符

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

因此,我创建了几个测试项目并使用您对^的定义,这是我在 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# 中定义新的全局运算符,但是,如果希望它是一个常规库,则可能不可接受的。

可以通过定义 C# 库中Integer类型中的公共静态方法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# 中的重载运算符不是惯用的,因此对于 C# 用户来说,使用Pow方法似乎很自然。

我相信您无法为对象定义**运算符的原因是这不是该语言支持的运算符之一。它不是一个公认的运营商。为什么不直接使用数学库http://msdn.microsoft.com/en-us/library/system.math.pow.aspx