2015-01-18 4 views
2

정확히이 구성원에 대해 다른 목록을 필터링 한 후 변환하려는 DU의 특정 구성원 목록이 있습니다. 다음하지만 - - 시간에 특정 시점에서이 목록은, FOOS 포함되어 있음을 알 수구분 된 노동 조합의 특정 구성원 목록을 변환하는 표준 방법은 무엇입니까

type FooBar = 
    | Foo of int 
    | Bar of int 

type FooBarWrapper = FooWrapper of FooBar 

let fbs = [Foo(1); Bar(2); Foo(3); Bar(4)] 

let onlyFoos x = 
    match x with 
     | Foo x -> true 
     | _ -> false 

let foos = fbs |> List.filter onlyFoos 

let fooValues (Foo x) = x + 1 

let result = foos |> List.map fooValues;; 

지금이 나에게 내가 바에 대한 일치 해달라고으로

let fooValues (Foo x) = x + 1 
       ^^^^^ 

에 대한 불완전한 패턴 일치를 제공합니다.

있는 유일한 방법은이

let fooValues x = 
    match x with 
     | Foo x -> x + 1 
     | _ -> failwith "Aint No Foo!" 

아아처럼 fooValues를 다시 작성하는 것입니다! 이제 나는 여기에 막대가 없을 거라는 것을 절대적으로 알고 있지만 다시 한 번 일치해야합니다.

그래서 F #에서 이것을 구현하는 가장 좋은 방법이나 구문 상 가장 즐거운 방법은 무엇입니까?

사이드 노트 : 하스켈도 같은 문제가 있습니까?

+2

약간 다른 방식으로 같은 질문을하는 것 같습니다. https://stackoverflow.com/questions/27910814/incomplete-pattern-match-on-parameters의 사본으로 읽습니다. 나는 거기에 솔루션을 적용한 것 같아요. –

+0

:-) - 여전히 F #에서 새롭고 그 주위에있는 길을 찾고 있습니다. 그리고 언제나처럼 - 멋진 기능이 있으며 다른 기능을 수확하고 싶다면 함께 살아야하는 "단점"이 있습니다. – robkuz

+0

F #에서 가르쳐 준 기능 중 하나는 기능 과부하 및 카레 결합이 어렵다는 것입니다. – robkuz

답변

6

저는 그것이 문제라고 생각하지 않습니다. 그것은 설계자의 의도대로 설계된 것입니다. 하스켈도 마찬가지입니다. 그렇지 않으면 오브젝트 및 부속 유형을 사용할 수 있습니다.

하지만 특별히 제공 한 샘플 코드의 경우 약간의 디자인 변경이 필요합니까?

let onlyFoos x = 
    match x with 
     | Foo x -> Some x 
     | _ -> None 

let foos = fbs |> List.choose onlyFoos 

let fooValues x = x + 1 
let result = foos |> List.map (Foo << fooValues) 

아이디어는 데이터로 DU 태그를 저장하는 대신 데이터를 저장하는 것입니다. 그렇지 않으면 모든 요소에 동일한 태그가 있음을 알기 때문에 태그가 중복됩니다. 나중에 다시 믹스 할 때 쉽게 다시 태그 할 수 있습니다.

+0

우수! 나는 그것이 내가 찾고 있었던 것이라고 생각한다. – robkuz