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")
Другие вопросы по тегам