我在状态monad中有一个数组和一个数组索引。我可以使用use
读取idx并使用+=
和其他类似修饰符对其进行修改:
{-# 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
现在我想将arr
和idx
合并为arr[idx]
形成一个镜头:
combo arr idx = undefined
bar x = do
combo arr idx += x
ii <- combo arr idx
return ii
我该怎么做? Data.Sequence
的代码会有所不同吗?
答案 0 :(得分: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
的原始不安全行为,可以将uses
替换为unsafeUses traversal = (^?! traversal) <$> get