2014-11-24 9 views
4

를 다운 캐스트 I 차별 노동 조합 유형이 :F 번호 : 차별 노동 조합

type F = 
| A of int 
| B of float 

가정하자 나는 A 형의 객체 산출하기 위해 필터링 된 F의 목록이 있습니다

let listOfAs=list.filter (fun f -> match f with | A(f') -> true | _ -> false) 

어떻게 내 코드에서 패턴 일치를 필요로하지 않고 F의 결과 목록을 사용하여 작업 할 수 있습니까? 직접 캐스트를 좋아하지 않는 컴파일러, 예를 들어

list.map (fun f -> int f) listOfAs 

답변

8
당신은 정말 차별 노조 값을 캐스팅 할 수

-F의 유형이 유형 int와 다른 것은 (그들이 같은이 곳은 C 조합을 좋아하지입니다 2 진 표현).

그래서 쉬운 용액 list<F>을 취하고 A 경우 감쌌다 만 int 값을 포함 list<int>를 반환하는 함수를 작성한다.

이렇게하려면 List.filter 대신 List.choose을 사용할 수 있습니다. 이것은 당신이 (값을 건너 의미) 또는 Some v (결과 목록의 일부로 반환 값 v을 의미)는 None을 반환 할 수 투사를 지정할 수 있습니다 보조 노트에

let listOfAs = List.choose (fun f -> 
    match f with 
    | A(f') -> Some f' 
    | _ -> None) 
+1

, 코드가 하나 단축 할 수 'fun f ->'를'function' 키워드로 바꾸고'match'줄을 제거하면됩니다. – Vandroiy

+3

예, 다음과 같을 수 있습니다 :-) 한 번에 두 가지를 설명해야하기 때문에 일반적으로 코드를 표시 할 때이 작업을 수행하지 않습니다! –