F#:如何在类型中定义计算的 属性?

F#: How can I define a computed property in a type?

在 C# 中,我可以这样定义计算的 属性:

public class MyViewModel
{
    public DateTime StartDate { get; set; }
    public string StartDateFormatted => StartDate.ToString("yyyy.MM.dd h:mm tt");
}

我如何在 F# 中执行此操作?

[<DataContract>]
[<CLIMutable>]
type MyViewModel = {
    [<DataMember>] StartDate            : DateTime
    [<DataMember>] StartDateFormatted   : string // How can I make this a computed property?
 }

在 F# 中非常相似:

open System

type MyViewModel() =
    member val StartDate = DateTime.Now
    member this.StartDateFormatted =
        this.StartDate.ToString("yyyy.MM.dd h:mm tt")

let model = MyViewModel()
printfn "%A" model.StartDateFormatted   // "2022.04.27 2:56 tt"

请注意,我使用 F# 的对象语法来定义类型,而不是其记录语法。这更接近您在 C# 中熟悉的内容。

如果您想使用记录类型,它看起来应该是这样的:

type MyViewModel =
    {
        mutable StartDate : DateTime
    }
    member this.StartDateFormatted =
        this.StartDate.ToString("yyyy.MM.dd h:mm tt")

let model = { StartDate = DateTime.Now }
printfn "%A" model.StartDateFormatted

请注意,默认情况下记录是不可变的,因此通常不用于 view-models(在 MVVM 设计中,它会更新以跟踪 UI 中所做的更改)。