\setbeamertemplate{footline}{} \setbeamerfont{block body}{size=\small} \definecolor{orchid}{RGB}{134, 134, 220} \setbeamercolor{block title}{fg=white,bg=orchid} \setbeamercolor{bgcolor}{fg=white,bg=blue}
- Lens
- Prism
- Traversal & Fold
- Map
- State
- Other
- Practical use of lenses, inspired by work
- Applied to the right problem, they are invaluable!
Lenses address some part of a “structure” that always exists
### Lens.Tuple.view.operator
### Lens.Tuple.view.function
### Lens.Tuple.set.operator
### Lens.Tuple.set.function
- Possibly the least interesting use of
lens
- For shallow use, barely different from access and update syntax
- “Distinguished products”
{-# LANGUAGE TemplateHaskell #-}
module Lenses where
import Control.Lens
data Record = Record
{ _field1 :: Int
, _field2 :: Int
}
makeLenses ''Record
### Lens.records.view
### Lens.records.set
Record lenses become quite useful when structure is deep
v & foo.bar.baz +~ 1
let f = _foo v
b = _bar f
z = _baz b in
v { _foo = f {
_bar = b {
_baz = z + 1 } } }
my_1 :: Lens' (Integer, Integer) Int
my_1 f (p1, p2) =
(\n -> (toInteger n, p2))
<$> f (fromIntegral p1)
my_1 :: Functor f
=> (Int -> f Int)
-> (Integer, Integer)
-> f (Integer, Integer)
\begin{center}
\begin{tabular}{l@{\hspace{1em}}|@{\hspace{1em}}l@{\hspace{2em}}}
view & \verb|v ^. l|
set & \verb|v & l .~ x| \
(set Just) & \verb|v & l ?~ mx| \
(incr) & \verb|v & l +~ n| \
(append) & \verb|v & l <>~ x| \
(apply) & \verb|v & l %~ f| \
(applyA) & \verb|v & l %%~ f|
\end{tabular}
\end{center}
Prisms address some part of a “structure” that may exist
{-# LANGUAGE TemplateHaskell #-}
module Lenses where
import Control.Lens
data ADT = Alpha Int Int
| Beta Record
| Gamma String
makePrisms ''ADT
### Lens.ADTs.preview.present
### Lens.ADTs.preview.absent
### Lens.ADTs.setter.present
### Lens.ADTs.setter.absent
v & _Beta.field1 +~ 1
case v of
Beta z ->
Beta (z { _field1 = _field1 z + 1 })
_ -> v
my_Left :: Prism' (Either Int Int) Int
my_Left = prism' Left $
either Just (const Nothing)
Traversals address many parts of a “structure” that may exist
### Traversal.List.preview
### Traversal.List.set
### Traversal.computations.digits.preview
### Traversal.computations.digits.set
### Traversal.computations.digits.set-flexible
- “Viewing” a traversal combines the elements using
Monoid
^..
turns each element into a singleton list, so theMonoid
result is a list of the elements
### Traversal.List.monoid
### Traversal.List.toListOf
### Traversal.List.allOf
\begin{center}
\small
\begin{tabular}{lll}
\verb|allOf| & \verb|andOf| & \verb|anyOf|
\verb|asumOf| & \verb|concatMapOf| & \verb|concatOf| \
\verb|elemOf| & \verb|findMOf| & \verb|findOf| \
\verb|firstOf| & \verb|foldMapOf| & \verb|foldOf| \
\verb|foldl1Of| & \verb|foldl1Of’| & \verb|foldlMOf| \
\verb|foldlOf| & \verb|foldlOf’| & \verb|foldr1Of| \
\verb|foldr1Of’| & \verb|foldrMOf| & \verb|foldrOf|
\end{tabular}
\end{center}
\begin{center}
\small
\begin{tabular}{lll}
\verb|foldrOf’| & \verb|forMOf_| & \verb|forOf_|
\verb|lastOf| & \verb|lengthOf| & \verb|lookupOf| \
\verb|mapMOf_| & \verb|maximumByOf| & \verb|maximumOf| \
\verb|minimumByOf| & \verb|minimumOf| & \verb|msumOf| \
\verb|noneOf| & \verb|notElemOf| & \verb|notNullOf| \
\verb|nullOf| & \verb|orOf| & \verb|productOf| \
\verb|sequenceAOf_| & \verb|sequenceOf_| & \verb|sumOf| \
\verb|toListOf| & \verb|traverseOf_| &
\end{tabular}
\end{center}
\begin{center}
\small
\begin{tabular}{l|l|l|l|l}
\textbf{Class} &
\textbf{Read} &
\textbf{Write} &
\textbf{Count} &
\textbf{Example} \ \hline\hline
Getter & y & & 1 & \verb|to f|
Lens & y & y & 1 & \verb|_1| \
Iso & y & y & 1 & \verb|lazy| \ \hline
Prism & y? & y? & 1? & \verb|only| \ \hline
Fold & y? & & 0* & \verb|folded| \
Setter & & y? & 0* & \verb|mapped| \
Traversal & y? & y? & 0* & \verb|traverse|
\end{tabular}
\end{center}
\begin{center}
\begin{tabular}{l@{\hspace{1em}}|@{\hspace{1em}}l@{\hspace{2em}}}
toListOf & \verb|v ^.. l|
preview & \verb|v ^? l| \
(demand) & \verb|v ^?! l|
\end{tabular}
\end{center}
### Map.at.view.present
### Map.at.view.absent
### Map.at.non.present
### Map.at.non.absent
### Map.ix.view.present
### Map.ix.view.absent
### Map.ix.view.demand
### Map.ix.set.present
### Map.ix.set.absent
### Map.ix.view.failing
### State.use
### State.uses
### State.preuse
### State.preuses
### State.set
### State.setM
### State.over
### State.zoom
### State.multi-set-plain
### State.multi-set
\begin{center}
\small
\begin{tabular}{lll}
\verb|ALens| & \verb|LensLike| & \verb|Writer|
\verb|lens-action| & \verb|lens-aeson| & \verb|thyme| \
Indexed lenses & Zippers & Exceptions \
Arrays & Vectors & \verb|FilePath| \
\verb|Numeric.Lens| & &
\end{tabular}
\end{center}
### Advanced.partsOf.indices
### Advanced.partsOf.filtered
### Advanced.partsOf.each
### Advanced.partsOf.set
### Advanced.partsOf.multiple
### Advanced.view-patterns.lambda
### Advanced.biplate.strings
### Advanced.biplate.ints
### Advanced.biplate.chars
### Advanced.biplate.partsOf
### Advanced.biplate.filtered
### Advanced.biplate.head