在 C# 中定义 F# '**' 运算符
Posted
技术标签:
【中文标题】在 C# 中定义 F# \'**\' 运算符【英文标题】:Define F# '**' operator in C#在 C# 中定义 F# '**' 运算符 【发布时间】:2013-09-17 04:33:27 【问题描述】:我看到 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# 中^
是逻辑异或。也许它被映射到 F# 中的那个(即^^^
)。
【参考方案1】:
正如我在 cmets 中所说,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# 中使用的 Exponentiation 运算符:
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# 类中定义一个静态的Pow
方法。要为其他内置 F# 运算符定义重载,请查看 prim-types.fs
。
这是对的,当我在 F# 中尝试 '^^^' 运算符时,它提升了一个幂。那么我应该停止在我的 C# 项目中使用 ^ 运算符进行电源操作吗?
@AlexanderKvenvolden 作为一个普通的 C# 用户,我不希望 ^
是指数。最终,这取决于您的用户的期望。【参考方案2】:
我认为您不能为对象定义 ** 运算符的原因是这不是该语言支持的运算符之一。这不是公认的运营商.. 为什么不只使用数学库 http://msdn.microsoft.com/en-us/library/system.math.pow.aspx
【讨论】:
我正在制作一种特殊的符号数字格式,并希望它在功能上与 F# 中的其他数字类型等效,包括支持所有中缀运算符。如果 C# 不支持它作为运算符,是否有一个特殊的名称我可以命名在 F# 或其他东西中使用时将挂钩到 ** 运算符的函数?以上是关于在 C# 中定义 F# '**' 运算符的主要内容,如果未能解决你的问题,请参考以下文章