종종 이질적인 객체 (다른 유형)의 모음을 반복 (지도, 반복 또는 접기)하려고합니다. 이를 처리하는 한 가지 방법은 차별화 된 노동 조합을 만드는 것인데,이를 통해 합법적으로 DU 케이스로 변환 된 오브젝트로 목록을 작성할 수 있습니다.차별 노동 조합의 구성원 목록을 통해이 반복을 단순화 할 수없는 이유는 무엇입니까?
type MYDU = | X1 of int
| X2 of float
| X3 of string
let bar (y: MYDU) =
match y with
| X1 x -> printfn "%A" x
| X2 x -> printfn "%A" x
| X3 x -> printfn "%A" x
[X1(1); X2(2.0); X3("3"); X1(4)]
|> List.map bar |> ignore
이 코드는 잘 실행 및 인쇄
1
2.0
"3"
4
대 : 다음 코드는 간단한 예제에서한다! 그러나 printfn
으로 전화를 반복해서 피할 수 있는지 궁금합니다. 나는 다음을 시도하고 컴파일되지 않습니다 :
let baz (y: MYDU) =
match y with
| X1 x | X2 x | X3 x -> printfn "%A" x // red squiggly line under X1 x
컴파일러 문제 메시지 :
This expression was expected to have type 'int' but here has type 'float'
나는 반복이 가능하다 피하는이 의심하지만 기본적인 실수를해야합니다. 어떤 제안?
예제 스 니펫에서 판단하기가 어렵지만 실제로 이질적인 목록이있는 시나리오는 이러한 종류의 일이 귀찮은 것이 아닐 정도로 실제로는 희귀해야합니다. 코드 검토에서 가치가있을 수도 있습니다. 너무 낮은 수준에서 도메인을 모델링 한 것일 수 있습니다. – scrwtp
일반적으로'List.map f |> ignore'를 할 때 언제나'List.iter'를 대신 사용해야합니다. 특히'f'가'unit'을 반환하는 함수 인 경우 (' bar '기능을 수행합니다). 'Seq.map'이 ** lazy **이기 때문에'List.map' 대신'Seq.map'을 사용하기로 바꿀 계획이라면 이것은 특히 중요합니다. 'Seq.iter'는 당신이 의도 한대로 seq 전체에서 반복됩니다. 'List.map' 대신에'List.iter'를 사용하면'Seq'를 사용하여 /로 전환 할 때 놀라지 않을 수 있습니다. – rmunn