【问题标题】:List of Records in F#?F# 中的记录列表?
【发布时间】:2011-11-27 00:09:45
【问题描述】:

您如何在 F# 中使用记录列表?您甚至如何将它作为参数传递给函数?我想做这样的事情:

type Car = {
  Color : string;
  Make : string;
  }

let getRedCars cars =
  List.filter (fun x -> x.Color = "red") cars;

let car1 = { Color = "red"; Make = "Toyota"; }
let car2 = { Color = "black"; Make = "Ford"; }
let cars = [ car1; car2; ]

我需要一种方法来告诉我的函数“汽车”是汽车记录列表。

【问题讨论】:

  • 问题不在于car1car2 声明不是type Car - 所以它不能自动确定类型签名。
  • 您的代码运行良好。 getRedCars 的推断签名是Car list -> Car list。您看到了什么错误?
  • 我想它确实有效。似乎 VS 起初认为这是一个错误,但最新编译它可以工作。这也有效(想知道它是否对编译器有帮助?):(fun (x : Visit) -> x.Color = "red") cars
  • 我也对其进行了测试,它确实可以正常工作,但我很惊讶getRedCars 正文末尾的单个; 是有效的。使用冗长的语法,除了 ;; 用于顶级声明,或 ` in ... ` 用于本地表达式。

标签: list f# functional-programming records


【解决方案1】:

您的代码运行良好。也可以写成:

let getRedCars cars =
  List.filter (function {Color = "red"} -> true | _ -> false) cars

如果您担心推断出错误的签名,您可以添加类型注释。例如:

let getRedCars (cars:Car list) : Car list = //...

【讨论】:

  • 谢谢,我不知道列表的类型注释。非常感谢。
  • @StephenSwensen:他很高兴知道这一点。此外,Component Design Guidelines (PDF) 的第 5.2 节建议使用前缀表示法,但有四个例外:listoptionarrayref
  • (由于混淆了前缀和后缀的重大错误,已删除并重新发布此评论) @Matthew:请注意,用于参数化类型的后缀语法是从 ML 继承的,但是您也可以使用 .NET 前缀语法:list<Car>.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
相关资源
最近更新 更多