Domanda

Ho una lista di record

type Item = { Color : string; Size : int}
let itemList = [{Color="Red"; Size=1};
                {Color="Green"; Size=2};
                {Color="Blue"; Size=3};]

Sto cercando di ottenere trasformare il mio elenco di record in un array di valori come [| "Rosso", "Verde", "Blu" |] o [| 1; 2; 3 |]

Posso sorta arrivare come questo

type ItemType =
| Color of string
| Size of int

type ItemEnum =
| C
| S

let GetProp x y =
match x with
| C -> List.toArray y |> Array.map(fun x -> ItemType.Color(x.Color))
| S -> List.toArray y |> Array.map(fun x -> ItemType.Size(x.Size))

, ma quando chiamo GetProp S itemList torno [| Taglia 1; Taglia 2; Dimensione 3 |]. Utile, ma non è esattamente quello che sto cercando.

Ho provato il seguente

let GetProp2 x y : 'a[] =
match x with
| Color -> List.toArray y |> Array.map(fun x -> x.Color)
| Size -> List.toArray y |> Array.map(fun x -> x.Size)

, ma non ama i due tipi restituiti diversi.

Sono aperto a suggerimenti su diversi modi (più funzionali?) Di fare questo e gradirebbe il vostro input.

È stato utile?

Soluzione

Un tipo variant personalizzato è davvero il modo di andare qui (e, in generale, ovunque è necessario un tipo che è "X o Y"). Tuttavia, come definito, la funzione sembra che potrebbe restituire un array in cui Color e Size sono mescolati, ma in pratica sembra che si desidera solo per tornare uno o l'altro. Se è così, questo è meglio riflette nei tipi:

type Items =
| Colors of string[]
| Sizes of int[]

let GetProp x ys =
match x with
| C -> Colors [| for y in ys -> y.Color |]
| S -> Sizes [| for y in ys -> y.Size |]

A proposito, v'è alcuna ragione particolare per cui si utilizzano motori di ricerca per tipo di ritorno qui, piuttosto che la solita sequenza di pigri (seq)?

Altri suggerimenti

È possibile utilizzare i modelli attivi per visualizzare i dati formano alcuni punti di vista:

let (|AsColor|) (v: Item list) = [| for i in v -> i.Color |];;

let (|AsSize|) (v: Item list) = [| for i in v -> i.Size |];;

match itemList,itemList with
  |AsColor ca, AsSize sa -> printfn "%A; %A" ca sa;;

Go go Comprensioni Array gadget!

> [| for a in itemList do yield a.Size |];;
val it : int [] = [|1; 2; 3|]
> [| for a in itemList do yield a.Color |];;
val it : string [] = [|"Red"; "Green"; "Blue"|]

Non hai bisogno di una struttura di dati intermedia ItemType o ItemEnum.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top