gpt4 book ai didi

f# - F# : (/) 中的重载运算符

转载 作者:行者123 更新时间:2023-12-03 22:49:39 24 4
gpt4 key购买 nike

我想在 F# 中为字符串重载 (/) 运算符并保​​留数字的含义。

/// Combines to path strings
let (/) path1 path2 = Path.Combine(path1,path2)

let x = 3 / 4 // doesn't compile

如果我尝试以下操作,我会得到“警告 29 扩展成员不能提供运算符重载。请考虑将运算符定义为类型定义的一部分。”
/// Combines to path strings
type System.String with
static member (/) (path1,path2) = Path.Combine(path1,path2)

有任何想法吗?

问候,
fork

最佳答案

您不能为现有类型提供重载运算符。一种选择是使用另一个运营商名称(如 Natahan 建议的那样)。但是,您也可以定义一个新类型来表示 F# 代码中的路径并提供 /此类型的运算符:

open System    

// Simple type for representing paths
type Path(p) =
// Returns the path as a string
member x.Path = p
// Combines two paths
static member ( / )(p1:Path, p2:Path) =
Path(IO.Path.Combine(p1.Path, p2.Path))

let n = 4 / 2
let p = Path("C:\\") / Path("Temp")

这有一个重要的好处 - 通过使类型更加明确,您可以为类型检查器提供更多信息,它可以用来验证您的代码。如果您使用字符串来表示路径,那么您很容易将路径与其他字符串(例如名称)混淆。如果您定义您的 Path类型,类型检查器会防止你犯这个错误。

此外,编译器不允许您(简单地)错误地组合路径(如果您将路径表示为字符串,这很容易发生),因为 p + p未定义(您只能使用 / ,它正确使用了 Path.Combine )。

关于f# - F# : (/) 中的重载运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2812084/

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