2016-09-23 3 views
2

다음 작업 코드가 주어집니다.F # : 함수에서 Union 형식 반환

type Square = 
    { Foo : int } 

type Circle = 
    { Bar : int } 

type Shape = 
    | Square of Square 
    | Circle of Circle 

let Test x = 
    match x with 
    | Square { Foo = f } -> 
     Circle { Bar = f + 1 } 
    | Circle { Bar = f } -> 
     Circle { Bar = f + 2 } 


let a = Square { Foo = 1 } 
let b = Test a 
let c = Test b 

기능 테스트에는 예상되는 반환 유형 (Shape -> Shape)이 있습니다. 그때 약간에 테스트의 정의를 변경하면 ...

let Test x = 
    match x with 
    | Square { Foo = f } -> 
     { Bar = f + 1 } 
    | Circle { Bar = f } -> 
     { Bar = f + 2 } 

테스트 기능 변화의 서명 모양 -> 원과 마지막 줄

let c = Test b 

지금 컴파일되지 않습니다. Test의 두 번째 정의가 왜 작동하지 않습니까? 테스트 기능의 서명이 변경되는 이유는 무엇입니까?

+2

모양이 원이 아니기 때문에 –

+0

'{Bar = f + 1} '편집에 대한 정교한 표현은 원형이 아니라 도형입니다. –

+0

작업 정의에서 원이 아닌가? – Craig

답변

2

는이 같은 모양의 유형을 정의 할 때 : Circle 두 번 나타나기 때문에

type Shape = 
    | Square of Square 
    | Circle of Circle 

이 조금 혼란 스러울 수 있습니다. 제 버전 결과

:

Circle { Bar = f + 1 } 

실제 형상이다. 이것이 원형 유형의 생성자, 특히 new X() 인 C++ 관용구와 거의 유사하기 때문에 혼란 스럽습니다. 그 결과

,

{ Bar = f + 1 } 

은 실제로 당신이 점점 오류를 설명하는 원이다.