gpt4 book ai didi

包含成员与类的 F# 记录

转载 作者:行者123 更新时间:2023-12-02 08:02:15 24 4
gpt4 key购买 nike

在 F# 中,您可以使用成员函数定义记录,也可以创建类。

type Album = {
Id: int
Name: string
DateReleased: DateTime
Genre: Genre }
with
member this.PrintMessage() =
printf "Hello from %s\n" this.Name

如此使用
let first = 
{ Id = 1;
Name = "Hello World!"
Genre = KPop;
DateReleased = DateTime(1991, 8, 12) }
first.PrintMessage()

和类它可能是这样的。
type Album(
Id: int,
Name: string,
DateReleased: DateTime,
Genre: Genre ) as me =
do
me.PrintMessage()
member this.PrintMessage() =
printf "Hello %s" Name

什么时候方便使用其中一种?
领域建模只能对记录进行吗?

可以通过一些隐藏的 FSharp Casting 将类转换为记录,反之亦然?

最佳答案

可以使用记录和类来完成域建模。我认为何时使用其中一个主要是偏好和环境问题。就我个人而言,我通常不使用类,但是我认识一些经常使用它们的人。类更多地依赖于变异,并且以易用性为代价提高了性能。我个人认为,如果您要编写面向对象的样式,则使用类,如果您要编写函数式样式,则使用记录作为一般指导。记录模式匹配和解构更容易。这种区别的一部分是文化上的,仅仅因为你可以用一种特定的方式做一件事并不意味着其他人就能很容易地理解你。编写代码供您自己和他人阅读。当您选择记录或类时,它会传达有关这些类型的样式和用法的意图。最后,我不知道在 F# 中可以将类转换为记录,如果可以,我实际上仍然建议不要这样做。这是因为将记录用作类和将类用作记录与围绕这些构造的文化规范发生冲突。我个人认为您的示例成员对记录和类(class)都很好。我通常喜欢为与给定类型关联的函数使用具有相同名称的模块,因为当函数碰巧使用记录类型以外的其他内容时,它可以减少困惑。但是,我认为没有礼貌的人会拒绝那里的任何一个代码示例。

type Album(
Id: int,
Name: string,
DateReleased: string,
Genre: int ) as me =
let mutable genre = Genre
//readonly property
member val Id = Id
//autoproperty with get and set
member val Name = Name with get, set
member val DateReleased = DateReleased with get, set
//property with explicit get and set
member this.Genre
with get () = genre
and set (value) = genre <- value

When should I use let, member val and member this.?

关于包含成员与类的 F# 记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55838917/

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