.net - Trouble with a member constraint invocation expression when the member signature has type variables in F# -
i'm having trouble using member constraint invocation expressions when member signature has type variables. specifically, code
[<autoopen>] module foo // preapplied lens type lens <'i,'j> = { : 'j; set : 'j -> 'i } // record type lenses type foo1 = { num_ : int; letter_ : char } member this.num = { = this.num_; set = (fun num' -> {this num_=num'})} member this.letter = { = this.letter_; set = (fun letter' -> {this letter_=letter'})} end let (foo1:foo1) = {num_ = 1; letter_ = 'a'} // ecord type lenses type foo2 = { num_ : int; name_ : string } member this.num = { = this.num_; set = (fun num' -> {this num_=num'})} member this.name = { = this.name_; set = (fun name' -> {this name_=name'})} end let (foo2:foo2) = {num_ = 2; name_ = "bob"} // add 2 record num lens let inline add2 (x : ^t) = let num = (^t : (member num : lens<^t,int>) (x)) in num.get + 2 gives error:
test05.fsx(39,47): error fs0010: unexpected symbol
)in expression
the issue @ member constraint invocation expression on second last line. basically, can't figure out how pass type variables ^t , int lens type within member constraint invocation expression. there way accomplish this?
there must space between < , ^ in static constraint:
// add 2 record num lens let inline add2 (x : ^t) = let num = (^t : (member num : lens< ^t,int>) (x)) in num.get + 2 otherwise, both characters <^ treated name of infix function (aka "operator").