2010-02-12 1 views
2

여기에 정말 분명한 것을 놓치고 있어야한다는 것을 알고 있습니다. B.GetInstance().Call()은 오류를 생성합니다 : 이 프로그램 점 이전의 정보를 기반으로 불확정 유형의 객체를 찾습니다. 객체의 유형을 제한하기 위해이 프로그램 포인트 이전에 유형 주석이 필요할 수 있습니다. 이로 인해 조회가 해결 될 수 있습니다.형식 주석 또는 캐스트에 대한 알 수없는 필요

저는 1.9.9.9를 사용하고 있습니다. (B.GetInstance() :> B).Call()

어떤 생각을 캐스팅이 필요한 이유 :

type A() = 
    member x.Call() = B.GetInstance().Call() 

and B() = 
    static member GetInstance() = new B() 
    member x.Call() =() 

난 그냥이 작품을 발견?

답변

7

추측 할 수있는 유형의 재귀 적 세트가있는 경우 F #에 도움이 필요합니다. 더 적절한 대안은 B.GetInstance의 정의 주석을하는 것입니다 : (

type A() = 
    member x.Call() = B.GetInstance().Call() 

and B() = 
    static member GetInstance() : B = new B() 
    member x.Call() =() 

나는이 문제로 실행하는 이유는 F 번호가 동시에 A와 B의 모든 방법의 모든 추론 유형을 해결하기 위해 시도하는 것을 생각을 그들 때문에 상호 재귀 적 유형으로 정의 됨), 이로 인해 문제가 발생하지만 F # 팀의 누군가가 영향을받을 것입니다.

+0

이해하기 쉽지 않습니다. 내 하루를 구 했어, 고마워! – Cynede

7

빠른 요약은 재귀 적 그룹 (예 : 한 유형의 구성원 또는 재귀 유형의 구성원 우리가 여기있는 것처럼) F #은 선언을 오른쪽에서 아래로 순서대로으로 읽은 다음 defi 왼쪽에서 오른쪽으로 위에서 아래로의 순서로의 네임. 따라서이 경우에 A.Call의 정의에 도달하면 정의B.GetInstance으로 읽지 못했기 때문에 GetInstance의 반환 유형이 B이됨을 알지 못합니다 (아직!).

키이스의 대답은이 상황을 감안할 때 반환 유형을 GetInstance으로 지정하기 위해 형식 주석을 제공 할 수 있습니다.

여기에 무슨 일이 일어나고 있는지에 대한 깊은 논의

Forcing F# type inference on generics and interfaces to stay loose

를 참조하십시오.

참고 또한이 원래 시도, 당신은 그것을 얻기 위해 (:를 사용하여 정적으로 유형을 선언) 대신 그냥 "주석"수 (:>를 사용하여 잠재적으로 역동적 인 동작을) "캐스트"할 필요가 없습니다 컴파일하기. 그러나 타입 어노테이션을 GetInstance에 대한 메소드 선언에 넣는 것이 더 좋습니다 (일반적으로 바디 내부의 임의의 장소 대신 메소드 서명에 추가 어노테이션 추가).

+0

위대한 설명. 내가 두 가지 대답을 표시 할 수 있다면. – Daniel

관련 문제