디버깅을 위해 printfn "%A"
이 제공하는 모든 부동 소수점에 대한 자세한 정보가 필요하며 모든 테스트 코드가 일반화되어 있습니다. 그래서 나는 box
을 알아 냈고 의미있는 출력을 얻기 위해 유형을 매치했습니다.하나 인 경우 해당 일반 식별 형 유니온에 일반화 된 유형 캐스팅
그러나 유형은 옵션 유형 또는 Result<_, _>
유형 (성공/실패) 일 수 있습니다. 이러한 유형은 패턴 일치 당신이 차별 노조로 처리,하지만 난 경우가 충돌하지 않습니다를 입력-테스트 :
// Illustrative example of what I'm trying to achieve (I think)
let rec mkStr v =
match box v with
| :? double as dbl -> Str.fromFloat dbl
| :? int64 as i -> i.ToString()
| _ ->
match v :> obj with
| :? Result<_, _> as res -> // this will never succeed
match res with
| Success s -> mkStr s
| Fail _ -> "Fail"
| x ->
x.ToString()
나는, 위의 권투/언 박싱/주조의 다양한 시도했습니다 이러한 종류 중 하나입니다. 내가 디버그 할 때 명확하게 Success
이 통과한다는 것을 볼 수 있습니다. 디버거는 Result
을 표시하지 않습니다. DU의 각 판별자가 그 자체로 하나의 유형이라는 것을 알고 있으므로 어떤 일이 일어나는지 알지만 컴파일러에게 또는 Fail
중 하나와 일치하면 DU로 취급하도록 컴파일러에 지시 할 수 있습니까?
TLDR : 일반화 된 유형이있는 경우 유형이있을 경우 기본 DU에 테스트하고 캐스트 할 수 있습니까?
(PS :이 일반적으로 뒤의에 대해 이동하는 방법이 아니라는 것을 알지만 printf "%A"
이 존재하는 것처럼, 나는이 상황에서로, 때때로이 필요하다고 가정)받을 인용을 사용
http://stackoverflow.com/q/3151099/82959, http://stackoverflow.com/q/39875110/82959 및 http://stackoverflow.com/q/2140079/82959를 참조하십시오. – kvb
@kvb, 나는 이미 재선이 필요하다고 두려워했다. 능동적 인 패턴과 인용문으로 좋은 솔루션. 감사. 내가 Google에서 찾지 못한 이유를 모르겠습니다. – Abel