假设由于某种奇怪的原因我想要这个功能:
let (~-) (str:string) = 42
所以我可以做这样的事情并得到 42 结果:
-"test"
val it : int = 42
这很好。但现在当我这样做时:
let a = 100
-a
I get:
error FS0001: This expression was expected to have type
string
but here has type
int
知道为什么会发生这种情况吗?
当您使用定义运算符时let
,新定义hides运算符的所有先前定义。因此,在您的示例中,您隐藏了一元减号(适用于数字)的默认实现,并将其替换为仅适用于字符串的新运算符。
在内置类型上重新定义重载运算符并不容易。如果您需要这样做,最好避免使用运算符(只需使用函数)。但是,如果您想为自定义类型提供重载运算符,可以通过将运算符添加为静态成员来实现:
type MinusString(s:string) =
member x.Value = s
/// Provide unary minus for MinusString values
static member (~-) (ms:MinusString) =
MinusString("-" + ms.Value)
-(MinusString "hi") // Returns "-hi"
如果您确实想重新定义内置运算符(例如一元减号)并使其工作string
,那么实际上有一种方法可以使用之前SO答案中描述的技巧 https://stackoverflow.com/questions/19682432/global-operator-overloading-in-f。但是,如果您有充分的理由,我只会使用它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)