Types 在学习F#时,为什么建议在字段中而不是在作业中指定类型?

Types 在学习F#时,为什么建议在字段中而不是在作业中指定类型?,types,f#,Types,F#,在中,有两种记录类型具有相同的字段标签集 图书记录 type Book = { Name: string; AuthorName: string; Rating: int; ISBN: string } type VHS = { Name: string; AuthorName: string; Rating: string; // Videos use a different rating system. ISBN: string }

在中,有两种记录类型具有相同的字段标签集

图书记录

type Book = 
  { Name: string;
    AuthorName: string;
    Rating: int;
    ISBN: string }
type VHS =
  { Name: string;
    AuthorName: string;
    Rating: string; // Videos use a different rating system.
    ISBN: string }
VHS记录

type Book = 
  { Name: string;
    AuthorName: string;
    Rating: int;
    ISBN: string }
type VHS =
  { Name: string;
    AuthorName: string;
    Rating: string; // Videos use a different rating system.
    ISBN: string }
如果您随后使用这些创建记录,那么F#将假定最后一个定义是您想要使用的定义(VHS)。因此,在“重复标签名称”标题下,建议在评级标签名称中添加一个类型,如下所示:

let theFSharpQuizBook = 
  { Name = "The F# Quiz Book";
    AuthorName = "William Flash";
    Book.Rating = 5;
    ISBN = "1234123412" }
我本以为这更清楚——在作业中指定类型:

let theFSharpQuizBook : Book = 
  { Name = "The F# Quiz Book";
    AuthorName = "William Flash";
    Rating = 5;
    ISBN = "1234123412" }

有没有理由不提及/建议/推荐这一点?

你的想法绝对是合理的;添加类型注释是F#中的一种常见技术

在这种情况下,我们可以将作者的建议解释如下:

  • 建议清单并不意味着详尽无遗
  • 在讨论记录类型时,使用
    Book.Rating
    更有趣。它说明了一点,即您可以通过使用一个标签名来消除不同记录类型的歧义
在某些情况下,使用标签名称更为自然,例如模式匹配:

let getRating { Book.Rating = r } = r
vs


在许多情况下,当您选择使用这两种约定中的一种时,这是个人偏好的问题。

虽然我不能说为什么在教程中没有提到它,但两者都有优点和缺点。就我个人而言,我会根据情况使用这两种方法,以及第三种变体

当您不需要将记录分配给变量,而只想使用它启动管道时,第一个选项非常有用,如下所示:

{   Name = "The F# Quiz Book";
    AuthorName = "William Flash";
    Book.Rating = 5;
    ISBN = "1234123412" }
|> Some
|> Option.toList
(请原谅这个空洞的例子,这是一种非常迂回的方法,可以将记录转换为包含单个元素的列表)

另一方面,正如您所说,显式注释let绑定的值可能更具可读性,但它要求您使用let绑定,并为记录命名

这里还有第三个选择,有时也会派上用场:

let theFSharpQuizBook'' = 
  { Name = "The F# Quiz Book";
    AuthorName = "William Flash";
    Rating = 5;
    ISBN = "1234123412" } : Book

谢谢你的回答。我曾怀疑你的第一个例子会是一个理由,但有一个澄清的例子非常方便。我不太清楚第三个例子应该用在什么样的场景中——你能给我举个例子或者对这一点多做一点解释吗?@Treffynnon事实上,我不记得了。。。我只是想起来,我偶尔会发现这很有用,但并不是那么常见。感谢您的回答和示例代码,演示了如何使代码更具可读性。我同意你的观点,教程中演示的技术更有趣、更不同寻常。你可以删除
从每行开始。只有在同一行上编写多个表达式时,才需要分号。