<div dir="ltr"><div><div><div><div>Hello there,<br><br></div>I'm starting to use a bit more extensively the lens package. It is clearly very powerful, but it feels like a maze of related components (Setting/Setter/Lens'/LensLike/Lens/Traversal/Traversal') which can be swapped for one another except when they can't.<br>
<br></div>The first (concrete) problem I ran into is how to update the members of a set with the result of an IO action. I have managed to do this with a pure function (prefixName) but I'm not sure of how to do this with promptName.<br>
<br></div>Full program below:<br><br> {-# LANGUAGE TemplateHaskell #-}<br> import Control.Lens<br> import Data.Set<br> import Data.Set.Lens<br><br> data Dog = Dog { _name :: String, _legs :: Int } <br> deriving (…)<br>
makeLenses ''Dog<br><br> data Dogs = Dogs { _dogs :: Set Dog } <br> deriving Show<br> makeLenses ''Dogs<br><br> fourLegs :: Traversal' Dog Dog<br> fourLegs = filtered (ëd -> d^.legs == 4)<br>
<br> promptName :: String -> IO String<br> promptName dogName = do<br> putStr $ "New name for " ++ dogName<br> getLine<br><br> prefixName :: Dog -> Dog<br> prefixName dog = set name ("PREFIXED: " ++ dog^.name) dog<br>
<br> main :: IO ()<br> main = do<br> let fido = Dog "fido" 4 <br> let milou = Dog "milou" 4 <br> let cripple = Dog "cripple" 3 <br> let doggies = Dogs $ fromList [fido, milou, cripple]<br>
<br></div> -- prefix dog names via a pure function<br><div> let doggies' = over (dogs.setmapped) prefixName doggies<br> print doggies'<br></div><div> -- change dog names by prompting the user ?<br>
</div><div> return ()<br><br></div><div>Help would be appreciated (in particular, 'cripple' would love to be renamed).<br></div><div><br></div><div>Since I was struggling with the library, I had the idea to look at the internals, but got stuck at the definition of Lens:<br>
<pre><span class="">type</span> <span class="">Lens</span> <span class="">s</span> <span class="">t</span> <span class="">a</span> <span class="">b</span> <span class="">=</span> <span class="">forall</span> <span class="">f</span><span class="">.</span> <span class="">Functor</span> <span class="">f</span> <span class="">=></span> <span class="">(</span><span class="">a</span> <span class="">-></span> <span class="">f</span> <span class="">b</span><span class="">)</span> <span class="">-></span> <span class="">s</span> <span class="">-></span> <span class="">f</span> <span class="">t<br>
</span></pre>a) I'm not sure why the explicit forall is needed here (isn't this equivalent to just Functor f => ...)?<br></div><div>b) My understanding is that a lens packs both getter and setters, but I don't know which is supposed to be which here...<br>
</div><div>c) Is there any kind of in-depth guide to Control.Lens somewhere? I have found some examples and tutorials but nothing that seemed to do more than scratch the surface.<br><br></div><div>Thanks,<br><br>Emm<br></div>
</div>