Списък със записи във 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
Вашият код работи добре. Предполагаемият подпис на getRedCars е Car list -> Car list. Какви грешки виждате?   -  person Daniel    schedule 28.09.2011
comment
Предполагам, че работи. Изглежда, че VS смята, че това е грешка в началото, но последната компилация работи. Това също работи (чудя се дали помага на компилатора?): (забавно (x : Посетете) -› x.Color = червено) автомобили   -  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