의 추론 다음 코드에서는 두 개의 인터페이스를 정의하며 두 번째 인터페이스는 첫 번째를 형식 매개 변수로 사용합니다. 그러나이 코드는 "유형 매개 변수 'a'가 정의되지 않았습니다"라는 오류를 제공합니다. F # '는이'정보 '가 우선'에 포함되어 있기 때문에 ISecond이 도출 될 때 어떤 유형 추론 할 수없는 이유중첩 된 일반 형식 f #
type IFirst<'a> =
abstract Data : 'a
type ISecond<'First when 'First :> IFirst<'a>> =
abstract First : 'First
abstract SomeData : 'a
내 질문은? 예를 들어 다음 코드에서 컴파일러는 'a'가 문자열임을 유추 할 수 있습니다.
type First() =
interface IFirst<string> with
member x.Data = ""
type Second() =
interface ISecond<First> with
member x.SomeData = ""
member x.First = First()
이 문제를 해결할 수있는 방법이 있습니까? 또는 ISecond가 두 가지 매개 변수를 사용해야합니까?
EDIT : 저는 ISecond가 두 가지 유형의 매개 변수를 사용할 수 있음을 알고 있습니다. (처음 질문의 마지막 줄을 기록하십시오). 그것은 분명 무슨 뜻인지 다음 코드 그것은 오류를 제공
type IFirst<'a> = interface end
type ISecond<'First, 'a when 'First :> IFirst<'a>> = interface end
type First() =
interface IFirst<string>
type Second() =
interface ISecond<First, int>
을 고려하려면 "이 표현은 형식 문자열을 것으로 예상했지만 여기에 int 형이있다"컴파일러 '는이'문자열입니다 것을 알고 의미, 아직까지는 그것을 그대로 선언해야합니다. 이것이 왜 그런지와 두 번째 유형 매개 변수를 지정하지 않고 해결 방법이 있는지 여부를 알고 싶습니다.
두 번째 매개 변수를 추가해야합니다. -''a'가 범위에 포함되어 있지 않습니다 (실제로는 유추에 관한 것이 아니라 유형의 구조에 관한 것입니다). – kvb