2009-12-19 9 views
1

는 내가 기록의 목록을

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

내가 [같은 값의 배열로 레코드를 내 목록을 설정 얻기 위해 찾고 | "레드"; "녹색", "블루"|] 또는 [| 1; 2; 3 |] 내가 그렇다고이

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)) 

처럼 거기에 도착 할 수 있지만 내가 GetProp S itemList를 호출 할 때 내가 돌아올

[| 크기 1; 크기 2; 크기 3 |. 유용하지만 정확한 것은 아닙니다.

나는 다음과 같은

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) 

을 시도했지만 그것은 두 개의 서로 다른 반환 형식을 좋아하지 않는다.

다른 방법 (더 기능적입니까?)에 대한 의견을 제시하고 의견을 보내 주시면 감사하겠습니다.

답변

5

맞춤 변형 유형은 정말로 여기에 오는 방법입니다 (일반적으로 'X 또는 Y'유형이 필요한 경우). 그러나 정의 된대로 함수는 ColorSize이 섞여있는 배열을 반환 할 수있는 것처럼 보이지만 실제로는 둘 중 하나만 반환하려는 것처럼 보입니다. 그렇다면,이 최선의 유형에 반영됩니다 :

그런데
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 |] 

, 당신은 오히려 평소 게으른 순서 (seq)보다, 여기에 입력 반환 배열을 사용하는 이유 어떤 특별한 이유가?

+0

배열은 다음에 사용할 외부 lib에 필요한 인수 유형입니다. 어떻게하면 레코드 목록에서 특정 값의 seq로 갈 수 있습니까? – RobRolls

+1

모든 목록은 이미 seq이며 배열도 마찬가지입니다. .NET 용어로 seq는'IEnumerable '입니다. 배열이나리스트를 무작위 seq (그리고 아마도 lazy)로부터 만들 필요가 있다면,'Seq.toArray'와'Seq.toList'는 그 트릭을 할 것입니다. –

1

가젯 간다 배열 이해!

> [| 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"|] 

당신은 중간 ItemType 또는 ItemEnum 데이터 구조가 필요하지 않습니다.

+0

, 따라 그 주장에. –

4

당신은 당신의 데이터보기의 몇 가지 포인트를 형성 볼 활성 패턴을 사용할 수 있습니다 : 그는 _different_ 요소 유형의 배열을 반환하는 _single_ 함수를 작성하려고로, 그 도움이되지 않습니다

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;; 
+0

아직 활성 패턴에 노출되지 않았습니다. 흥미 롭 군, 고마워. – RobRolls