![Page 1: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/1.jpg)
A Modern History of Lenses
Tony Morris
November 25, 2014
![Page 2: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/2.jpg)
Goals
the motivation for lensesthe definition of and nomenclature for lensesthe problems encountered for lensesthe proposed solutions and recent developmentsthe current solution
![Page 3: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/3.jpg)
Goals
the motivation for lensesthe definition of and nomenclature for lensesthe problems encountered for lensesthe proposed solutions and recent developmentsthe current solution
![Page 4: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/4.jpg)
Goals
the motivation for lensesthe definition of and nomenclature for lensesthe problems encountered for lensesthe proposed solutions and recent developmentsthe current solution
![Page 5: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/5.jpg)
Goals
the motivation for lensesthe definition of and nomenclature for lensesthe problems encountered for lensesthe proposed solutions and recent developmentsthe current solution
![Page 6: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/6.jpg)
Goals
the motivation for lensesthe definition of and nomenclature for lensesthe problems encountered for lensesthe proposed solutions and recent developmentsthe current solution
![Page 7: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/7.jpg)
Why Lenses?the premise
We want to do programmingand anything but functional programming is completely insane.
![Page 8: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/8.jpg)
Why Lenses?
If you accept that fact of matterthen you also accept that data types must be immutable.
![Page 9: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/9.jpg)
Why Lenses?
OK let’s try that
data Street =Street {
name :: String-- , ...
}
![Page 10: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/10.jpg)
Why Lenses?
data Employee =Employee {
company :: Company-- , ...
}
data Company =Company {
address :: Address-- , ...
}
data Address =Address {
street :: Street-- , ...
}
![Page 11: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/11.jpg)
Why Lenses?
Then your team leader says to youPlease set employer’s street address to upper-case.
![Page 12: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/12.jpg)
Why Lenses?
ARGH!
upperStreetFirst ::Employee-> Employee
upperStreetFirst e =e {
company = ( company e) {address = ( address ( company e)) {
street = ( street ( address ( company e))) {name = map toUpper
(name ( street ( address ( company e))))}
}}
}
![Page 13: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/13.jpg)
Why Lenses?
Scala insists on repeating history’s mistakes
def upperStreetFirst (e: Employee ): Employee =e.copy( company = e. company .copy(
address = e. company . address .copy(street = e. company . address . street .copy(
name = e. company . address . street .name.map(_. toUpper )
))
)
![Page 14: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/14.jpg)
Why Lenses?
We must subsume dysfunctional programmingbecause crushing victory is the best kind.
(company.address.street.name %= toUpper) e
We need lenses.
![Page 15: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/15.jpg)
Why Lenses?
We must subsume dysfunctional programmingbecause crushing victory is the best kind.
(company.address.street.name %= toUpper) e
We need lenses.
![Page 16: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/16.jpg)
What is a Lens?
Lens is a data structure
data Lens target field =Lens {
get :: target -> field, set :: target -> field -> target}
![Page 17: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/17.jpg)
What is a Lens?
With three lawsget lens (set lens t f) == f
set lens (get lens t) t == t
set lens (set lens t f) f’ == set lens t f’
![Page 18: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/18.jpg)
What is a Lens?For example
Formerly
company :: Employee -> Companyaddress :: Company -> Addressstreet :: Address -> Streetname :: Street -> String
![Page 19: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/19.jpg)
What is a Lens?For example
Becomes
company :: Employee ‘Lens ‘ Companyaddress :: Company ‘Lens ‘ Addressstreet :: Address ‘Lens ‘ Streetname :: Street ‘Lens ‘ String
![Page 20: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/20.jpg)
What is a Lens?Lenses do lots of interesting things
Lenses can compose to a new Lens
(.) :: (a ‘Lens ‘ b) -> (b ‘Lens ‘ c) -> (a ‘Lens ‘ c)
company :: Employee ‘Lens ‘ Companyaddress :: Company ‘Lens ‘ Addresscompany . address :: Employee ‘Lens ‘ Address
![Page 21: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/21.jpg)
What is a Lens?
Lens comes in a small variety of formulations
data Lens target field =Lens {
getset :: target -> (field -> target , field)}
![Page 22: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/22.jpg)
What is a Lens?
Twan van Laarhoven lens
data Lens target field =Lens {
run :: forall f. Functor f =>(field -> f field ) -> ( target -> f target )
}
![Page 23: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/23.jpg)
What is a Lens?
We can derive functions from Lens
-- modify the current field of a target(%=) :: Lens target field -> (f -> f) -> t -> tLens g s %= k =
s <*> k . g
![Page 24: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/24.jpg)
What is a Lens?
At this point, subsumption is achievedWe can do at least as well as dysfunctional programming
(company.address.street.name %= toUpper) e
We have won.We have won at winning.
![Page 25: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/25.jpg)
Problem?
But subsuming archaic ideas is not a noble goalCan we do better? What other problems exist? Can we winwinning against winning?
![Page 26: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/26.jpg)
Problem?
JSON
data Json =JNull| JNumber Double| JArray [Json]| JObject [(Str , Json )]-- ...
Please set the object at "key" in the first array value tonull.
![Page 27: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/27.jpg)
Problem?
JSON
JArray [ JObject [("key", JNumber 7)], JNu mber 4]
JArray [ JObject [("key", JNumber 7)], JNu ll]
![Page 28: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/28.jpg)
Problem?
But what ifWe don’t have an array?The array does not have a first value?The first value is not an object?The object does not have a "key"?
We need partiality in our lenses.
![Page 29: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/29.jpg)
Problem?
But what ifWe don’t have an array?The array does not have a first value?The first value is not an object?The object does not have a "key"?
We need partiality in our lenses.
![Page 30: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/30.jpg)
Partiality
Partial Lens
data PartialLens target con =PartialLens ( target -> Maybe (con -> target , con ))
![Page 31: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/31.jpg)
Partial Lens
For example
jArray ::PartialLens JSON [Json]
jArray =PartialLens (\j ->
case j of JArray a ->Just (JArray , a)
_ ->Nothing
)
![Page 32: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/32.jpg)
Partial Lens
HoweverThis structure violates many of our desirable lens properties thatwe had come to rely on. Our three laws do not translate.
![Page 33: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/33.jpg)
The Polymorphic Update problem
Suppose we have this structure
data StringAnd a =StringAnd String a
![Page 34: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/34.jpg)
The Polymorphic Update problem
And two values such as
aLens :: Lens ( StringAnd a) aaLens = ...
value :: StringAnd [Int]value = StringAnd "abc" [1 ,5 ,10 ,100]
![Page 35: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/35.jpg)
The Polymorphic Update problem
And we need to modify the [Int] field to a String. However,
(%=) ::Lens target field ->(field -> field) ->( target -> target )
(%=) ::Lens ( StringAnd a) a ->(a -> a) ->( StringAnd a -> StringAnd a)
![Page 36: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/36.jpg)
The Polymorphic Update problem
We want to polymorphically update the field
(%=) aLensPoly ::(field -> newfield ) ->( StringAnd field -> StringAnd newfield )
![Page 37: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/37.jpg)
Solutions
The Theory of LensesThere have been many efforts to find a unifying theory of lenses toaddress the practical problems that we have identified.
An inexhaustive list follows.
![Page 38: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/38.jpg)
Solutions
data-lensStarted in 2008 by Edward Kmett; maintained by RussO’Connor and me.Hit walls with doing polymorphic update and partiality whenexperimenting.Mostly abandoned now due to subsumption. The solution wasultimately found.
![Page 39: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/39.jpg)
Solutions
data-lensStarted in 2008 by Edward Kmett; maintained by RussO’Connor and me.Hit walls with doing polymorphic update and partiality whenexperimenting.Mostly abandoned now due to subsumption. The solution wasultimately found.
![Page 40: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/40.jpg)
Solutions
data-lensStarted in 2008 by Edward Kmett; maintained by RussO’Connor and me.Hit walls with doing polymorphic update and partiality whenexperimenting.Mostly abandoned now due to subsumption. The solution wasultimately found.
![Page 41: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/41.jpg)
Solutions
fclabelsStarted in 2009 by Sebastian Visser.Originally only resolved the fundamental problems addressedby lenses.Now supports polymorphic update, but partiality isproblematic.
![Page 42: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/42.jpg)
Solutions
fclabelsStarted in 2009 by Sebastian Visser.Originally only resolved the fundamental problems addressedby lenses.Now supports polymorphic update, but partiality isproblematic.
![Page 43: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/43.jpg)
Solutions
fclabelsStarted in 2009 by Sebastian Visser.Originally only resolved the fundamental problems addressedby lenses.Now supports polymorphic update, but partiality isproblematic.
![Page 44: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/44.jpg)
Solutionsmubbip-woo!
Asymmetric Lenses in ScalaA paper in 2012 by me.An effort to invite discussion and improvements outside ofHaskell.Discussion flourished, but Scala and "improvements" remainas elusive as yowies.
![Page 45: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/45.jpg)
Solutionsmubbip-woo!
Asymmetric Lenses in ScalaA paper in 2012 by me.An effort to invite discussion and improvements outside ofHaskell.Discussion flourished, but Scala and "improvements" remainas elusive as yowies.
![Page 46: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/46.jpg)
Solutionsmubbip-woo!
Asymmetric Lenses in ScalaA paper in 2012 by me.An effort to invite discussion and improvements outside ofHaskell.Discussion flourished, but Scala and "improvements" remainas elusive as yowies.
![Page 47: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/47.jpg)
Solutions
Lenses in Scalazscalaz.{Lens, PLens, IndexedLens, IndexedPLens}
Polymorphic update, but still partiality eludes us, like yowies.
![Page 48: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/48.jpg)
Solutions
Lenses in Scalazscalaz.{Lens, PLens, IndexedLens, IndexedPLens}
Polymorphic update, but still partiality eludes us, like yowies.
![Page 49: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/49.jpg)
The Solution
Control.Lens
type Lens s t a b =Functor f =>(a -> f b) -> s -> f t
Twan van Laarhoven lens representationPolymorphic updatebut. . . Partiality? Multiple update?
![Page 50: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/50.jpg)
The Solution
Control.Lens.Prism
type Prism s t a b =( Applicative f, Choice p) =>p a (f b) -> p s (f t)
Solves partiality.Importantly, is principled.Gives rise to diverse practical consequences.No more hacks or hitting walls!
![Page 51: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/51.jpg)
The Solution
Control.Lens.Traversal
type Traversal s t a b =Applicative f =>(a -> f b) -> s -> f t
View and update multiple values.Fold to only view multiple values.
![Page 52: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/52.jpg)
The Solution
and it gets interesting. . .These structures are just functions.A Fold is a Traversal.A Prism is a Traversal.They are all a Lens.They all compose with (.) (regular function composition).
![Page 53: A Modern History of Lensesdata.tmorris.net/talks/modern-history-of-lenses/f1816a123cfc8d6f7c… · Why Lenses? Scalainsistsonrepeatinghistory’smistakes defupperStreetFirst(e: Employee):](https://reader033.vdocument.in/reader033/viewer/2022050406/5f834c7f2a0b1b40bc748300/html5/thumbnails/53.jpg)
The Solution
and even more and more interesting. . .But let’s leave it here :)