gpt4 book ai didi

f# - 使用类型别名来指示参数语义是标准做法吗?

转载 作者:行者123 更新时间:2023-12-03 23:32:47 25 4
gpt4 key购买 nike

元组中的项目没有名称,这意味着您通常没有明确的方法来记录每个项目的含义。

例如,在这个受歧视的联合中:

type NetworkEvent =
| Message of string * string * string
| ...

我想说清楚,第一项和第二项分别是发件人和收件人姓名。做这样的事情是个好习惯吗:
type SenderName = string
type RecipientName = string

type NetworkEvent =
| Message of SenderName * RecipientName * string
| ...

很多 C/C++ 库都有大量的类型(例如 win32.h),但是在这些语言中,即使参数名称在许多情况下是可选的,它仍然可以完成。 F# 的情况并非如此。

最佳答案

我认为将类型别名用于文档目的是一种很好且简单的方法来记录您的可区分联合。我在许多演示中使用了相同的方法(请参阅 for example this one ),我知道有些人也在生产应用程序中使用它。我认为有两种方法可以使定义更不言自明:

使用类型别名:这样,您添加了一些在 IntelliSense 中可见的文档,但它不会通过类型系统传播 - 当您使用别名类型的值时,编译器会将其视为 string ,因此您不会在任何地方看到附加文档。

使用单例联合 这是一种已在 F# 编译器的某些地方使用的模式。它使信息比使用类型别名更明显,因为类型 SenderName实际上是与 string 不同的类型(另一方面,这可能会有一些小的性能损失):

type SenderName = SenderName of string
type RecipientName = RecipientName of string
type NetworkElement =
| Message of SenderName * RecipietName * string

match netelem with
| Message(SenderName sender, RecipientName recipiet, msg) -> ...

使用记录:这样,您明确定义了一个记录来携带联合案例的信息。这在语法上更加冗长,但它可能以最易于访问的方式添加了附加信息。您仍然可以对记录使用模式匹配,或者您可以使用点表示法来访问元素。在开发过程中添加新字段也更容易:
type MessageData = 
{ SenderName : string; RecipientName : string; Message : string }
type NetworkEvent =
| Message of MessageData

match netelem with
| Message{ SenderName = sender; RecipientName = recipiet; Message = msg} -> ...

关于f# - 使用类型别名来指示参数语义是标准做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8584535/

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