在C#中定义F#’**’运算符
发布时间:2020-12-15 08:38:22 所属栏目:百科 来源:网络整理
导读:我看到F#使用**运算符作为幂,所以2 ** 5 = 32.这与C#不同,你可以选择在自定义类型中使用’^’运算符,但由于某种原因不是由内置数字类型使用. 但是如何在C#中实现**运算符以用于F#项目? 如果我在C#中这样做: public static Integer operator ^(Integer left
我看到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); } 它编译得很好,我可以像”运算符一样使用它,但这些都不适用于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#中使用的Exponentiation运算符: 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方法看起来很自然. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |