2

我在状态单子中有一个数组和一个数组索引。我可以使用 idx和其他类似的修饰符来读取use和修改它:+=

{-# 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 = do
    idx += x
    ii <- use idx
    return ii

现在我想组合arridx形成一个镜头arr[idx]

combo arr idx = undefined

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

我怎样才能做到这一点?代码会有所不同Data.Sequence吗?

4

1 回答 1

0

答案原来只是

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

由于索引可能超出范围,ix因此称为偏镜头Traversal。所以bar必须使用uses而不是use

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

由于偏心,ii也代替Monoid m => m Int了。Int

如果需要返回的原始不安全行为,Int可以通过替换usesunsafeUses traversal = (^?! traversal) <$> get

于 2014-12-03T22:26:40.983 回答