haskell - Using lens for array indexing if both array and index are in State -


i have array , array index in state monad. can read idx using use , modify using += , other similar modifiers:

{-# language templatehaskell #-} import control.lens import control.lens.th import control.monad.state import data.array  data m = m { _arr :: array int int, _idx :: int }  $(makelenses ''m)  foo x =     idx += x     ii <- use idx     return ii 

now want combine arr , idx form lens arr[idx]:

combo arr idx = undefined  bar x =     combo arr idx += x     ii <- combo arr idx     return ii 

how can this? code different data.sequence?

the answer turned out just

combo arr idx f m = (arr . ix (m^.idx)) f m 

as index may out of bounds, ix partial lens called traversal. bar has use uses instead of use:

foo x =     combo arr idx += x     ii <- uses $ combo arr idx     return ii 

also ii monoid m => m int instead of int, because of partiality.

if original unsafe behaviour of returning int needed can restored replacing uses unsafeuses traversal = (^?! traversal) <$> get


Comments

Popular posts from this blog

c++ - OpenMP unpredictable overhead -

ruby on rails - RuntimeError: Circular dependency detected while autoloading constant - ActiveAdmin.register Role -

javascript - Wordpress slider, not displayed 100% width -