<div>One option is to avoid the struct: approach and go with the following Lens definition.</div><div><br></div><div>(define-type Lens (All (A B) (case-&gt;  (A -&gt; B) (B A -&gt; A))))</div><div><br></div><div>Then along the lines below works.</div>
<div><br></div><div>(: mod (All (A B) (Lens A B) (B -&gt; B) A -&gt; A))</div><div>(define (mod lens f a)</div><div>  (lens (f (lens a)) a))</div><div><br></div><br><div class="gmail_quote">On Sat, Jun 2, 2012 at 7:27 PM, Ray Racine <span dir="ltr">&lt;<a href="mailto:ray.racine@gmail.com" target="_blank">ray.racine@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>I&#39;d like to create a Lens structure which is a procedure structure.  The structures exec procedure would be a case-lambda parameterized by A, B.</div>
<div><br></div><div>(define-struct/exec:  (A B) Lens ([getter : (A -&gt; B)][setter : (B A -&gt; A)]) [fn : (case-&gt; (A -&gt; B) (B A -&gt; A))])</div>
<div><br></div><div>where fn would be the getter and setter detemined by arity at the call site.</div><div><br></div><div>Looks like currently a define-struct/exec: cannot be parameterized.  Is this something that might be available down the road?</div>

<div><br></div><div>The goal is to say</div><div><br></div><div>(int-lens 3 (int-lens 2))</div><div><br></div><div>as opposed to say</div><div><br></div><div>(set int-lens 3 (get int-lens 2))</div><div><br></div><div>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</div>

<div>;; Below is current effort.  Want to do a define-struct/exec</div><div>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</div><div><br></div><div>(struct: (A B) Lens ([getter : (A -&gt; B)]</div>

<div>                     [setter : (B A -&gt; A)]))</div><div><br></div><div>(: get (All (A B) (Lens A B) A -&gt; B))</div><div>(define (get lens a)</div><div>  ((Lens-getter lens) a))</div><div><br></div><div>(: set (All (A B) (Lens A B) B A -&gt; A))</div>

<div>(define (set lens b a)</div><div>  ((Lens-setter lens) b a))</div><div><br></div><div>(: mod (All (A B) (Lens A B) (B -&gt; B) A -&gt; A))</div><div>(define (mod lens f a)</div><div>  (set lens (f (get lens a)) a))</div>

<div><br></div><div>(: and-then (All (A B C) (Lens A B) (Lens B C) -&gt; (Lens A C)))</div><div>(define (and-then lens-ab lens-bc)</div><div>  (Lens (ė: ((a : A))</div><div>          ((Lens-getter lens-bc) ((Lens-getter lens-ab) a)))</div>

<div>        (ė: ((c : C) (a : A))</div><div>          (mod lens-ab (ė: ((b : B)) ((Lens-setter lens-bc) c b)) a))))</div><div>          </div><div>(: compose (All (A B C) (Lens B C) (Lens A B) -&gt; (Lens A C)))</div><div>

(define (compose lens-ab lens-ca)</div><div>  (and-then lens-ca lens-ab))</div><div>              </div>
</blockquote></div><br>