如何在 F# 中覆盖复合类型中的 ToString?

Posted

技术标签:

【中文标题】如何在 F# 中覆盖复合类型中的 ToString?【英文标题】:How do I Override ToString in a Composite Type in F#? 【发布时间】:2014-12-08 15:51:41 【问题描述】:

我正在学习如何在 F# 中创建复合*类型,但遇到了一个问题。我有这种类型和一个 ToString 覆盖。

type MyType =
    | Bool of bool
    | Int of int
    | Str of string
    with override this.ToString() =
            match this with
            | Bool -> if this then "I'm True" else "I'm False"
            | Int -> base.ToString()
            | Str -> this

let c = Bool(false)
printfn "%A" c

我在 ToString 覆盖中收到一个错误,提示“此构造函数应用于 0 个参数,但需要 1 个”。我很确定这段代码不会编译,但它显示了我正在尝试做的事情。当我注释掉覆盖并运行代码时,c 打印为“val c : MyType = Bool false”。当我进入该代码时,我看到 c 有一个属性 Item 设置为布尔值 false。但是,我似乎无法在代码中访问此属性。即使我注释c也不会。

在这种情况下我应该如何覆盖 ToString?

* 我很确定这些被称为复合类型。

【问题讨论】:

【参考方案1】:

当您使用Discriminated Union (DU)(这是该类型的适当名称)时,您需要像这样解压缩匹配语句中的值:

type MyType =
    | Bool of bool
    | Int of int
    | Str of string
    with override this.ToString() =
            match this with
            | Bool(b) -> if b then "I'm True" else "I'm False"
            | Int(i) -> i.ToString()
            | Str(s) -> s

let c = Bool(false)
printfn "%A" c

您看到的Item 属性是一个实现细节,不能从F# 代码访问。仅仅使用this 是行不通的,因为DU 是值的包装器,所以this 指的是包装器,而不是包含的值。

【讨论】:

以上是关于如何在 F# 中覆盖复合类型中的 ToString?的主要内容,如果未能解决你的问题,请参考以下文章

intellij idea中怎么覆盖tostring(),hashcode(),equals()?

在 PostgreSQL 中,如何根据 C 函数中的类型 Oid 识别类型是复合类型?

Arrays 类中的 .toString() 是如何重载的

如何在 Java 中正确覆盖 toString()?

java如何用方法toString()将枚举类型转换为字符串类型

Python 怎么用代码实现解"复杂的复合函数的值域"类型的数学题?