2010-05-08 3 views
0

데이터의 시계열을 저장할 클래스를 만들려고합니다. 그룹별로 구성되었지만 컴파일 오류가 발생하여 기본 (간단 함 인스턴스화) 여전히 컴파일 오류를 극복 할 수 없습니다. 나는이 문제를 전에 보았던 사람이 있었으면 좋겠다. 는 Clas는 다음과 같이 정의한다 : - :Generics가있는 클래스 : 'constructor deprecated'오류가 발생했습니다.

type tempRec = { 
    someKey: string ; 
    someVal1: int ; 
    someVal2: int ; 
} 

let keyFunc r:tempRec = r.someKey 
// error occurs on the following line 
let q = new TimeSeriesQueue<tempRec, string> keyFunc 

This construct is deprecated: The use of the type syntax 'int C' and 'C ' is not permitted here. Consider adjusting this type to be written in the form 'C'

type TimeSeriesQueue<'V, 'K when 'K: comparison> = class 
     val private m_daysInCache: int 
     val private m_cache: Map<'K, 'V list ref > ref; 
     val private m_getKey: ('V -> 'K) ; 

     private new(getKey) = { 
      m_cache = ref Map.empty 
      m_daysInCache = 7 ; 
      m_getKey = getKey ; 
     } 

end 

그래서 (이되지 않을 수도 있습니다,하지만 오류 또는 경고가 나던) 나에게 확인을 보이는 인스턴스 오류를 가져옵니다 NOTE 이것은 단순한 어리 석음 일 수 있습니다. 저는 방학에서 돌아오고 있습니다. 그리고 내 두뇌는 여전히 시간대의 지체에 있습니다 ...

답변

7

컴파일러는 단지 당신이 괄호 안에 생성자의 매개 변수를 묶

// the following should work fine 
let q = new TimeSeriesQueue<tempRec, string>(keyFunc) 

다른 문제가 생각이 있습니다 - 생성자는 (그렇지 않으면 당신이 그것을 호출 할 수 없습니다) 공개 할 필요가 있고 keyFunc의 매개 변수 (괄호 안에 또한 그렇지 않으면 컴파일러해야한다) 유형 주석이 함수의 결과를 위해이라고 생각합니다

let keyFunc (r:tempRec) = r.someKey 

당신은 또한 클래스는 F #에서 훨씬 간단 선언의 수 암시 생성자 구문을 사용하여 고려할 수 있습니다. (개인) 필드는 단순히 let를 사용하여 생성자의 매개 변수가 자동으로 클래스의 본문에 사용할 수있게하고 당신은 선언 할 수

type TimeSeriesQueue<'V, 'K when 'K: comparison>(getKey : 'V -> 'K) = 
    let daysInCache = 7 
    let cache = ref Map.empty 

    member x.Foo() =() 
+0

내가 keyFunc로 오타를 발견 않았다 - 나는 내 코드를 단순화되면서 발생해야합니다 게시하다. 인스턴스화와 관련하여 괄호를 추가했는데 방금 두 번째 컴파일 오류가 발생했습니다. "메서드 또는 개체 생성자 'TimeSeriesQueue2'을 (를) 찾을 수 없습니다. 클래스 구문을 암시 적으로 변경하는 것에 반대하지 않았습니다. 명시 적으로 그것을 해결 ... – akaphenom

+0

nevermind ... 휴가 rediculousness, costructor 개인으로 표시했다 ... – akaphenom

관련 문제