<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">If I read this right, things like “withFilter” in Scala could be considered a lens on the original collection. &nbsp;In that it does not actually perform any function on the collection, but the following function call on the views the data through that lens.<div class=""><br class=""></div><div class="">Scala</div><div class=""><br class=""></div><div class=""><div class="">val a = List(1,2,3,4,5)</div><div class=""><br class=""></div><div class="">&gt;&gt; a: List[Int] = List(1, 2, 3, 4, 5)</div><div class=""><br class=""></div><div class="">val b = a.withFilter(x =&gt; x % 2 == 0 )</div><div class=""><br class=""></div><div class="">&gt;&gt; scala.collection.generic.FilterMonadic[Int,List[Int]] = scala.collection.TraversableLike$WithFilter@77f0d43c</div><div class=""><br class=""></div><div class="">val c = b.map(x =&gt; x)</div><div class=""><br class=""></div><div class=""><div class="">&gt;&gt; c: List[Int] = List(2, 4)</div><div class=""><br class=""></div></div><div><blockquote type="cite" class=""><div class="">On 2016-01-15, at 8:11:56, Michael Henson via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">It's a way of referring to a specific member of a type with a data structure that, when given an instance of the type, behaves as if it's actually a direct reference to that member on that instance.<br class=""><br class="">If you have:<br class=""><br class="">struct Example {<div class="">&nbsp; &nbsp; let name: String</div><div class="">}<br class=""><br class="">If you have a Lens for the 'name' member of the 'Example' type:<br class=""><br class="">let nameLens = Example#name // assume this generates a Lens, for this example<br class=""><br class="">then you can hold on to that, pass it around, etc. and apply it to any Example instance you might encounter later on.<br class=""><br class="">The idea comes primarily from Functional Programming. I'm not familiar enough with FP concepts to go into depth about the ways it's useful in that field, but it has come up in Swift because there isn't currently a way to refer to getters and setters on data properties in the same way that you might be able to directly refer to a member function. The Lens approach seems to be the current front-runner for Swift's answer to that problem.<br class=""><br class="">Mike</div></div><div class="gmail_extra" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><br class=""><div class="gmail_quote">On Thu, Jan 14, 2016 at 4:44 PM, Andrey Tarantsov<span class="Apple-converted-space">&nbsp;</span><span dir="ltr" class="">&lt;<a href="mailto:andrey@tarantsov.com" target="_blank" class="">andrey@tarantsov.com</a>&gt;</span><span class="Apple-converted-space">&nbsp;</span>wrote:<br class=""><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex;"><div style="word-wrap: break-word;" class="">Could you please explain what a lens is/means? I only found [1], but quick skimming didn't reveal any lenses.<div class=""><br class=""></div><div class="">[1]&nbsp;<a href="https://www.youtube.com/watch?v=estNbh2TF3E" target="_blank" class="">https://www.youtube.com/watch?v=estNbh2TF3E</a><br class=""><div class=""><br class=""></div><div class="">A.</div><div class=""><br class=""></div><div class=""><br class=""><div class=""><blockquote type="cite" class=""><div class=""><div class="h5"><div class="">On Jan 15, 2016, at 6:10 AM, Michael Henson via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class=""></div></div><div class=""><div class=""><div class="h5"><div dir="ltr" class="">There hasn't been a major Lens thread on the list so far, but I'm intrigued by the idea and was tinkering with a related proposal until I stumbled across Brandon William's "Lenses in Swift" video and discovered that Lenses cover everything I wanted to do and more.<br class=""><br class="">The one thing that stuck with me, though, is the question of syntax. If Lenses are to be a native part of the Swift language, how would one declare them?<br class=""><br class="">We've currently got not-so-secret methods at the type level of Structs and Classes for every member function:<br class=""><br class="">class Example {<div class="">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span>func action() {}</div><div class="">}</div><div class=""><br class=""></div><div class="">let example = Example()</div><div class="">example.action // () -&gt; Void</div><div class="">Example.action // (Example) -&gt; Void<br class=""><br class="">That looks a lot like a Lens on the member function, though if I understand correctly the current plan is for those to go away in a future version.<br class=""><br class="">We also have to deal with Type-level members and functions:<br class=""><br class="">class Example {</div><div class="">&nbsp; &nbsp;static action() {}</div><div class="">&nbsp; &nbsp;static name: String</div><div class="">}</div><div class=""><br class=""></div><div class="">Example.action() // () -&gt; Void<br class="">Example.name // String<br class=""><br class="">So, using a dot-operator as the way to get a Lens could be problematic due to name collisions.<br class=""><br class="">The Proposal:<br class=""><br class="">Use the '#' character in place of the dot operator to retrieve a Lens for a Type/member pair:<br class=""><br class="">Example#action() // (Example) -&gt; Void<br class="">Example#name &nbsp; &nbsp;// Lens&lt;Example,String&gt;, autogenerated to work on the 'name' member</div><div class=""><br class="">Member function names should be fully-specified with the mechanism from Doug Gregor's method naming proposal.<br class=""><br class="">Some notes:<br class="">* A specific operator stands out and is easier to scan for as a code reader.</div><div class="">* The octothorpe seems to be available in Swift.<br class=""></div><div class="">* It also has a current meaning in a technology familiar to most everyone - the Document Fragment in HTML - which could make the idea easier to explain to newcomers, by analogy.<br class=""><br class="">What about Lenses on Type-level members? My first thought is that we don't have to support that because they're more like namespaced globals rather than parts of a data type. They can always be referenced directly. That might be a vacuous observation to people more familiar with the Lens concept, but I noted it for completeness.<br class=""><br class="">Mike</div></div></div></div><img src="https://u2002410.ct.sendgrid.net/wf/open?upn=LRtxqIpN0uduUbaiFaLozLZv7i-2BSLNOBgkrlBNK2PSWsFR-2F8KF21afhZNNq3EK6M8imH-2B-2FGE8E7MBylPP43W5v-2FvrjRDh-2F4oEV6NGtgBM9nIbQYZ5jLkI9uhy3q4tLRtEa-2BHi-2B-2Fksq-2FVSjS9ior3ppVLzjHpxrwSs9b4o6Xd-2Fm3cfqAiW6cjRzt3xh8EXx-2FqVe7H8UIxwb7tKZFsWX5mOyPF1cGrNH9ZQxpMkGQ-2FHpI-3D" alt="" width="1" height="1" border="0" style="min-height: 1px !important; width: 1px !important; border-width: 0px !important; margin: 0px !important; padding: 0px !important;" class=""><span class="Apple-converted-space">&nbsp;</span>_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" target="_blank" class="">swift-evolution@swift.org</a><br class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class=""></div></blockquote></div><br class=""></div></div></div></blockquote></div><br class=""></div><img src="https://u2002410.ct.sendgrid.net/wf/open?upn=CGU22LnxbYa2EM3wKvzuC6syQDwKa0tMs5IyT5gL1wKlWx9xF0z5g-2BZJnEFKfdUAgRm9PT8qbGZ9v8PSqA8dWJ-2BFm-2FbHwTHMcFhukW2Wl7grocglqtkTPQSxil9Hi2IMKHjIAn4qRztZ1aQsKsUhsWBaFlrVgaK45o-2B5kYy4ddfHEycoNcOQ5jhS2sG5ROqDV-2FYNP7ejv-2B9UHqRdEWx-2FEJDUWBY8-2BE6fp157zFpRE-2Fc-3D" alt="" width="1" height="1" border="0" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; height: 1px !important; width: 1px !important; border-width: 0px !important; margin: 0px !important; padding: 0px !important;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class=""><span class="Apple-converted-space">&nbsp;</span>_______________________________________________</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">swift-evolution mailing list</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><a href="mailto:swift-evolution@swift.org" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">swift-evolution@swift.org</a><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a></div></blockquote></div><br class=""></div></body></html>