F# Список перемещения разных типов
У меня есть пять разных типов:
type Name = string
type PhoneNumber = int
type Sex = string
type YearOfBirth = int
type Interests = string list
type Client = Name * PhoneNumber * Sex * YearOfBirth * Interests
Которые представляют клиентов. Тогда, скажем, у меня есть три таких клиента:
let client1 = "Jon", 37514986, "Male", 1980, ["Cars"; "Sexdolls"; "Airplanes"]
let client2 = "Jonna", 31852654, "Female", 1990, ["Makeup"; "Sewing"; "Netflix"]
let client3 = "Jenna", 33658912, "Female", 1970, ["Robe Swinging"; "Llamas"; "Music"]
let clients = [client1; client2; client3]
Как бы я пошел по поиску через clients
для определенного элемента? Скажите, у меня есть метод, в котором я хочу получить имена клиентов того же пола, что и я? Я написал нижеприведенную функцию, по крайней мере, для определения того, является ли входной пол одинаковым, но это не очевидно.
let rec sexCheck sex cs =
match cs with
| [] -> []
| c::cs -> if sex = c then sex else sexCheck sex cs
sexCheck "Male" clients
Есть намеки?
1 ответ
Решение
Вы можете накапливать результаты в другом параметре, например:
let sexCheck sex cs =
let rec loop acc (sex:string) cs =
match cs with
| [] -> acc
| ((_, _, s, _, _) as c)::cs -> loop (if sex = s then c::acc else acc) sex cs
loop [] sex cs
Как обычно, я хотел бы напомнить вам, какой самый простой способ, используя предоставленные функции в F#:
clients |> List.filter (fun (_, _, c, _, _) -> c = "Male")