如果数组和索引都处于状态,这是使用镜头进行数组索引的更简单版本,因为我已经解决了一些问题。我不确定是否应该删除原件或原地编辑。
给定
{-# Language TemplateHaskell #-}
{-# Language Rank2Types #-}
import Control.Lens
import Control.Lens.TH
import Data.Array
data M = M { _arr :: Array Int Int, _idx :: Int } deriving (Show)
$(makeLenses ''M)
我想写一个函数
combine :: Lens' M (Array Int Int) -> Lens' M Int -> Lens' M Int
这需要arr
和idx
镜头并构造一个组合镜头,可用于读取和写入 指向的元素idx
。我想要的镜头存在:
comboGet :: M -> Int
comboGet m = _arr m ! _idx m
comboSet :: M -> Int -> M
comboSet m v = m { _arr = _arr m // [(_idx m, v)] }
combo1 :: Simple Lens M Int
combo1 = lens comboGet comboSet
我理解这一点comboGet
,comboSet
原则上可以重写为单独使用arr
和idx
镜头。
combo1
我的问题是:用arr
and构建最惯用的方法是什么idx
?