Список записей в F #?

Как вы работаете со списком записей в 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; ]

Мне нужен способ сообщить моей функции, что "автомобили" - это список записей автомобилей.


person Matthew    schedule 28.09.2011    source источник
comment
Не будет ли проблема заключаться в том, что объявления car1 и car2 не относятся к type Car, поэтому он не может автоматически определить сигнатуру типа.   -  person Orbling    schedule 28.09.2011
comment
Ваш код работает просто отлично. Предполагаемая подпись getRedCarsCar list -> Car list. Какие ошибки вы видите?   -  person Daniel    schedule 28.09.2011
comment
Думаю, это работает. Кажется, что VS сначала подумал, что это ошибка, но последняя компиляция работает. Это тоже работает (интересно, помогает ли это компилятору?): (fun (x : Visit) -> x.Color = red) cars   -  person Matthew    schedule 28.09.2011
comment
Я тоже протестировал его, и он работает нормально, но я удивлен, что единственный ; в конце тела getRedCars действителен. Используя подробный синтаксис, я бы исключил только ;; для объявления верхнего уровня или `in...` для локального выражения.   -  person Stephen Swensen    schedule 28.09.2011


Ответы (1)


Ваш код работает просто отлично. Также можно написать:

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

Если вы когда-либо беспокоились о том, что выводится неправильная подпись, вы можете добавить аннотации типа. Например:

let getRedCars (cars:Car list) : Car list = //...
person Daniel    schedule 28.09.2011
comment
Спасибо, я не знал тип аннотации для списков. Огромное спасибо. - person Matthew; 28.09.2011
comment
@StephenSwensen: ему полезно знать об этом. Кроме того, раздел 5.2 документа Руководство по проектированию компонентов (PDF) рекомендует использовать префиксную нотацию с четырьмя исключениями: list, option, array и ref. - person Daniel; 28.09.2011
comment
(удален и повторно опубликован этот комментарий, так как произошла серьезная ошибка при смешивании префикса и постфикса) @Matthew: обратите внимание, что синтаксис постфикса, используемый для параметризованных типов, унаследован от ML, но вы также можете использовать синтаксис префикса .NET. : list<Car>. - person Stephen Swensen; 28.09.2011