使用镜头数组索引如果两个数组和索引都在国(Using lens for array indexing

2019-10-21 08:35发布

我有一个数组,并在状态单子阵列索引。 我可以通过读取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

Answer 1:

答案竟然是刚刚

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

iiMonoid m => m Int而非Int因为偏袒。

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



文章来源: Using lens for array indexing if both array and index are in State