Ale*_*den 6 c# f# exponent operator-keyword
我看到F#使用**运算符来表示幂,所以2 ** 5 = 32.这与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);
}
Run Code Online (Sandbox Code Playgroud)
它编译得很好,我可以像'+'运算符一样使用它,但这些都不适用于F#:
let intgr3 = intgr1 ** intgr2
let intgr3 = intgr1 ^ intgr2
Run Code Online (Sandbox Code Playgroud)
在C#中,这不起作用:
public static Integer operator **(Integer left, Integer right)
{
if (Integer.IsNaN(left) || Integer.IsNaN(right)) return NaN;
return left.RaiseToPower(right);
}
Run Code Online (Sandbox Code Playgroud)
那么如何**在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
Run Code Online (Sandbox Code Playgroud)
您可以在F#中定义新的全局运算符,但是如果您希望这是一个可能不可接受的通用库.
您可以通过在C#库Pow中的Integer类型中定义公共静态方法来定义在F#中使用的Exponentiation运算符:
public static Integer Pow(Integer left, Integer right)
{
if (Integer.IsNaN(left) || Integer.IsNaN(right)) return NaN;
return left.RaiseToPower(right);
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以直接在F#中使用它**.我会注意到C#中的重载运算符不是惯用的,所以Pow对于C#用户来说,拥有一个方法似乎很自然.
我相信您无法为对象定义 ** 运算符的原因是这不是该语言支持的运算符之一。它不是公认的运算符..为什么不直接使用数学库 http://msdn.microsoft.com/en-us/library/system.math.pow.aspx
| 归档时间: |
|
| 查看次数: |
742 次 |
| 最近记录: |