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
Post a Comment