2017-10-04 2 views
1

Person 인스턴스를 만들고 싶습니다. 사람은 동물의 한 유형입니다. Person을 만들려고 할 때 IDE는 "이 표현식에는 'Person'유형이 있어야하지만 여기에는 'Animal'유형이 있습니다.공용체 이름과 같은 이름으로 새 객체 만들기

type Person(name) = 
    member this.Name: string = name 

type Animal = 
| Person of Person 
| Cat 
| Dog 

let person: Person = Person(name = "John") 
+0

왜 이런지 모르겠지만 대답으로 추가하지는 않겠지 만,'new'를 추가하면'let person : Person = new Person (name = "John")'이 작동합니다. – MarcinJuraszek

+0

@MarcinJuraszek 'new'키워드를 사용하고 싶지 않고 'new'를 사용하면 IDE에 'new'가 중복되어 있다고 나와 있습니다. –

+0

흥미 롭습니다. F # Interactive에서만 테스트했습니다. – MarcinJuraszek

답변

1

문제 Person의 종류와 판별 연합의 경우 모두를 지칭한다는 것이다. 이 마지막으로 해결할 수 있도록

당신은 정의를 반전 할 수 있습니다 @MarcinJuraszek는 의견 제시 또는 DU 케이스와 다른 이름을 고려로

type Animal = 
    | Person of Person 
    | Cat 
    | Dog 
and 
    Person (name) = 
     member this.Name: string = name 

let person: Person = Person(name = "John") 

// then to create an animal 
let animal = Animal.Person (Person(name = "John")) 

대안 솔루션은 new 키워드를 사용할 수 있습니다 유형.

+0

"유형, 예외 또는 모듈 'Person'의 중복 정의." –

+0

이 시나리오에서'Animal' 유형의'Person'을 어떻게 만들겠습니까? – Matiasd

+0

@Matiasd 필자는 IDE가 말한 오류 만 게시합니다. 그리고 공용체 Person에는 매개 변수가 없지만 Person 클래스는 있습니다. –

1

F # 이름은 유형 및 값에 대한 바인딩으로 작동하며 언제든지 이름이 "가리키는"것을 다시 정의 할 수 있습니다. 예 :

// lets define type A 
type A(name) = member this.Name : string = name 
let x = A("test") 

// lets "bind" the type name 'A' to a new type 
type A(number) = member this.Number : int = number 
let y = A(10) 

printfn "type name of x: %s" (x.GetType().Name) // prints 'type name of x: A' 
printfn "type name of y: %s" (y.GetType().Name) // prints 'type name of y: A' 

그래서 xyA라는 유형의 두하지만 동일하지 않습니다. 동일한 논리가 PersonAnimal.Person에 적용되며 정의한 순서에 따라 Person을 입력 할 때 참조 된 정의가 마지막으로 정의됩니다.

위에서 언급 한 것처럼 새 명령이나 정의 명령을 사용하여 둘 모두에 액세스 할 수 있습니다. Animal이 아닌 다른 모듈에 Person 클래스를 추가 할 수도 있습니다.

module Inner = 
    type Person(name) ... 

이렇게하면 모듈 이름 앞에 추가하여 유형에 액세스 할 수 있습니다.

관련 문제