views:

86

answers:

1

I am trying to create a a class that will store a time series of data - organized by groups, but I had some compile errors so I stripped down to the basics (just a simple instantiation) and still can't overcome the compile error. I was hoping some one may have seen this issue before. Clas is defined as:

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

So that looks OK to me (it may not be, but doesnt have any errors or warnings) - the instantiation gets the error:

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'

NOTE This may be simple stupidity - I am just getting back from holiday and my brain is still on time zone lag...

+6  A: 

The compiler is just saying that you need to enclose parameters of the constructor in parentheses:

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

There are some other issues though - the constructor needs to be public (otherwise you cannot call it) and the parameter of keyFunc should be also in parentheses (otherwise, the compiler will think that the type annotation is for the result of the function):

let keyFunc (r:tempRec) = r.someKey

You may also consider using implicit constructor syntax which makes class declarations a lot simpler in F#. Parameters of the constructor automatically become available in the body of the class and you can declare (private) fields simply using let:

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

  member x.Foo() = ()
Tomas Petricek
I did notice the typo with the keyFunc - must have occured as I was simplifying my code to post. I did add parens around the instantiation and it just generated a second compilation error:"Method or object constructor 'TimeSeriesQueue`2' not found"I am not opposed to changing class syntax to implicit - but i should be able to solve it explicitly as well...
akaphenom
nevermind... vacation rediculousness, the costructor was marked as private...
akaphenom