在 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# '**' 运算符的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中定义新的运算符? [复制]

C#运算符重载---逐步地分析与理解

了解下C# 运算符重载

无法在 C# 中使用 mysql 分配运算符

[转] Unity Mathf 数学运算(C#)

如何在 C# 中为枚举重载运算符?