在 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# 不允许您定义新的运算符,**
也不是 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