Mixing Lens operations with "original" operations Is it reasonable to mix Control.Lens operations with the ones provided by the "standard library"?

Consider the following fragment using qualified Data.Map as Map:

getUniqueIdent :: String -&gt; State (Map.Map String Int) (Maybe String)
getUniqueIdent typeName = do indices &lt;- StM.get
                             let identifiers = Map.lookup typeName typeNameMap
                             let uniqueIndex = Map.lookup typeName indices
                             StM.modify $ over (at typeName) (fmap succ)
                             let uniqueIdent = (^?) &lt;$&gt; identifiers &lt;*&gt; 
                                                        (element &lt;$&gt; uniqueIndex)
                             return $ join uniqueIdent


For example, I do use both the Map.lookup and Lens.at and also the (^?) as a safe alternative for (!!).

Should I just stick to lenses "everywhere" (at least in spatially local code)?
I wouldn't say there's anything like a proscription against doing so, but as a non-user of lens I can't say it helps me understand what's going on. I'm also not sure that your data structure is complex enough to warrant using lens in this case, functions out of base tend to produce a pretty concise solution on their own when properly deployed.

I haven't tested this, but I think it's equivalent.

import Control.Monad.State
import Data.Map
import Safe (atMay) -- "safe".Safe.atMay :: [a] -&gt; Int -&gt; Maybe a

getUniqueIdent :: String -&gt; State (Map String Int) (Maybe String)
getUniqueIdent typeName =
  do indices &lt;- get
     modify $ adjust succ typeName
     return $ do identifiers &lt;- Data.Map.lookup typeName typeNameMap
                 uniqueIndex &lt;- Data.Map.lookup typeName indices
                 identifiers `atMay` uniqueIndex