gpt4 book ai didi

F# 和运算符重载 : (>) and (^)

转载 作者:行者123 更新时间:2023-12-04 22:43:10 30 4
gpt4 key购买 nike

好的,有人可以向我解释为什么 F# 允许您重载 > 和 ^ 运算符,但不允许您使用它们吗?

+ (op_Addition): Works just fine.
^ (op_Concatenate): Compiler error in F#. Apparently only strings can be concatenated.
> (op_GreaterThan): Runtime Error – Failure during generic comparison: the type Program+OppTest4 does not implement the System.IComparable interface.

如果我将 F# 代码编译为库并使用 VB 中的那些运算符,它们都可以正常工作。如果我使用 C# 中的那些运算符,除了 op_Concatenate 之外的所有运算符都可以工作(如预期的那样)。但是 F# 不仅会忽略其中的一些,静态类型检查器甚至不会告诉您它计划这样做。

编辑代码示例

type OppTest4(value: int) =
member this.value = value
static member (^) (left : OppTest4, right : OppTest4) =
OppTest4( Int32.Parse( left.value.ToString() ^ right.value.ToString() ))
static member (+) (left : OppTest4, right : OppTest4) =
OppTest4(left.value + right.value )
static member (>) (left : OppTest4, right : OppTest4) =
left.value > right.value
static member (<) (left : OppTest4, right : OppTest4) =
left.value < right.value

最佳答案

F# 对这些对 F# 来说合理的运算符符号具有默认含义。你总是可以定义你自己的含义来掩盖默认值,a la

let (>) x y = ...

例如,您可以将此运算符定义为表示“T.operator>(U)”(假设 x 的类型为 T,y 的类型为 U)。

有关默认定义,请参阅源分发中 FSharp.Core 中的 prim-types.fs。 (它们非常重要!)

鉴于 (1) 缺乏对 CLR 上类似类型类机制的支持(用于在一组其他不相关的类型中定义公共(public)语义)和 (2) 原始类型(如 'int ') 通常需要对任何编程语言实现进行特殊处理(例如 System.Int32 没有定义 operator+ 方法,但大多数编程语言选择表现得好像存在这样的方法),很难想象任何通常可互操作的运算符东西今天在 .Net 上跨所有语言。有很多设计权衡取舍取决于语言选择做什么(这里有太多相互作用的问题无法总结)。在任何情况下,您都应该能够从 F# 调用任何方法,并且如果默认运算符行为不合需要,您可以将运算符重新定义(隐藏)为您想要的行为。如果您在某个特定场景中遇到工作困难,请告诉我。

编辑

我在

添加了更多细节

http://cs.hubfs.net/forums/thread/10869.aspx

关于F# 和运算符重载 : (>) and (^),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/967508/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com