【问题标题】: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# 中的那个(即^^^)。

标签: c# f# operator-keyword exponent


【解决方案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# 或其他东西中使用时将挂钩到 ** 运算符的函数?
猜你喜欢
  • 2014-05-21
  • 2013-11-07
  • 2011-04-30
  • 2010-10-25
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多