<div dir="ltr">Hi,<div><br></div><div>The following example works in Typed Racket:</div><div><br></div><div><div>(struct foo</div><div>  ([c : Float]</div><div>   [f : (foo -> Float)]))</div><div><br></div><div>(define (test [f : foo]) : Float</div><div>  ((foo-f f) f))</div><div><br></div><div>(test</div><div> (foo 1.0</div><div>      (lambda ([x : foo]) : Float</div><div>        (match x ((foo c _) c)))))</div><div><br></div><div>(struct bar foo</div><div>  ([i : Float]))</div><div><br></div><div>(test</div><div> (bar 1.0</div><div>      (lambda ([x : foo]) : Float</div><div>        (match x </div><div>          ((bar c _ i) (+ c i))))</div><div>      1.0))</div></div><div><br></div><div><br></div><div>Unfortunately, I couldn't make foo polymorphic:</div><div><br></div><div><div>(struct (R) foo</div><div>  ([c : R]</div><div>   [f : ((foo R) -> R)]))</div><div><br></div><div>(define (test [f : (foo Float)]) : Float</div><div>  ((foo-f f) f))</div><div><br></div><div>(test</div><div> (foo 1.0</div><div>      (lambda ([x : (foo Float)]) : Float</div><div>        (match x </div><div>          ((foo c _) c)))))</div><div><br></div><div>(struct (R) bar foo</div><div>  ([i : Float]))</div><div><br></div><div>(test</div><div> (bar 1.0</div><div>      (lambda ([x : (foo Float)]) : Float</div><div>        (match x </div><div>          ((bar c _ i) (+ c i))))</div><div>      1.0))</div></div><div><br></div><div>The problem is in the match in the last expression, which shows three type errors:</div><div><br></div><div><div>Type Checker: cannot apply a function with unknown arity; function `unsafe-struct-ref' has type Procedure which cannot be applied in: (match x ((bar c _ i) (+ c i)))</div><div>  #(364 41)</div></div><div><br></div><div>Can someone tell me what I'm doing wrong here?</div><div><br></div><div>Thanks,</div><div>António.</div></div>