<div><br></div><div>Evan Laforge wrote:</div><div>&gt;I consider that a strength of the lens approach.  If I say &#39;set</div><div>&gt;(a.b.c.d) 42 record&#39;, &#39;a&#39;, &#39;b&#39; etc. don&#39;t have to be record fields, I</div>
<div>&gt;can swap them out for other lenses later on.</div><div>&gt;</div><div>&gt;I can also easily precompose, e.g. &#39;setThis = a . b; setThat = b . c&#39;</div><div>&gt;and encourage people to use the composed ones (or require via export</div>
<div>&gt;lists).  This corresponds to &quot;asking&quot; in that it introduces a point of</div><div>&gt;abstraction where I can change all access / modification in one place,</div><div>&gt;or a module can retain control by only exporting the composed version.</div>
<div><br></div><div>The same is true with SEC functions:</div><div><br></div><div>&gt;personsSalary&#39; :: (Salary -&gt; Salary) -&gt; Person -&gt; Person</div><div>&gt;personsSalary&#39; = job&#39; . salary&#39;</div><div>
<br></div><div>Here I&#39;ve created a new updater that is</div><div>composed of 2 that are generated for me (from</div><div>the examples given in the original email). I</div><div>can export whichever of these functions I</div>
<div>like, generated or otherwise, and keep as much</div><div>abstraction as I like!</div><div><br></div><div>The nice part about the SEC functions is that</div><div>they compose as regular functions. Lenses are</div><div>
super powerful in that they form a category.</div><div>Unfortunately using categories other than</div><div>functions feels a tad unwieldy because you</div><div>have to hide something from prelude and then</div><div>import Category. (A bit like exceptions,</div>
<div>currently).</div><div><br></div><div>If you like the look of &quot;set&quot; with lenses,</div><div>you could define a helper function to use</div><div>with SEC updaters.</div><div><br></div><div>&gt;set :: ((b -&gt; a) -&gt; c) -&gt; a -&gt; c</div>
<div>&gt;set sec = sec . const</div><div>&gt;</div><div>&gt;--and then use it like so:</div><div>&gt;setPersonsSalary :: Salary -&gt; Person -&gt; Person</div><div>&gt;setPersonsSalary salary = set personsSalary&#39; salary</div>
<div><br></div><div>With it you can use an updater as a setter.</div><div>I&#39;d like to reiterate one of finer points of</div><div>the original proposal.</div><div><br></div><div>&gt;The compiler could disallow using old-style</div>
<div>&gt;update syntax for fields whose SEC update</div><div>&gt;function is not in scope, giving us</div><div>&gt;fine-grained control over access and update.</div><div>&gt;On the other hand we currently have to create</div>
<div>&gt;new functions to achieve this (exporting the</div><div>&gt;getter means exporting the ability to update</div><div>&gt;[using update syntax] as well, currently).</div><div><br></div><div>And now back to lenses:</div>
<div><br></div><div>&gt;it is really convenient how lenses let you compose the getter</div><div>&gt;and setter together.</div><div><br></div><div>I don&#39;t recall too many cases where having the</div><div>getter and setter and modifier all in one</div>
<div>place was terribly useful. Could anyone give</div><div>me an example? But again, where that is</div><div>useful, a lens can be created from a getter</div><div>and a SEC updater.</div><div><br></div><div>Thoughts?</div>
<div><br></div><div>--Jonathan</div>