Haskell 用镜头索引访问矢量元素
我正在寻找一种方法,使用镜头库引用向量的元素 让我试着用一个简化的代码示例来解释我要实现的目标 我在这个monad transformer堆栈中工作(其中StateT是重点,其他一切都不重要) MyState有很多字段,但其中一个字段是客户端向量,它是我定义的数据类型:Haskell 用镜头索引访问矢量元素,haskell,vector,haskell-lens,Haskell,Vector,Haskell Lens,我正在寻找一种方法,使用镜头库引用向量的元素 让我试着用一个简化的代码示例来解释我要实现的目标 我在这个monad transformer堆栈中工作(其中StateT是重点,其他一切都不重要) MyState有很多字段,但其中一个字段是客户端向量,它是我定义的数据类型: data MyState = MyState { ... , _clients :: V.Vector ClientT } 每当我需要
data MyState = MyState { ...
, _clients :: V.Vector ClientT
}
每当我需要访问我的客户时,我倾向于这样做:
import Control.Lens (use)
c <- use clients
let neededClient = c V.! someIndex
... -- calculate something, update client if needed
clients %= (V.// [(someIndex, updatedClient)])
导入控制。镜头(使用)
cclients.ix 0
是一个遍历。特别是,遍历是setter,因此设置和修改应该可以正常工作:
clients.ix 0 .= updatedClient
您的问题在于使用。因为遍历不一定只包含一个值,所以当您使用
遍历(或对其使用其他一些getter函数)时,它会合并所有值,假设它们是幺半群
类型
特别是,
use (clients.ix n)
如果n
超出范围,则希望返回mempty
相反,您可以使用preuse
函数,该函数将丢弃除第一个遍历目标(或更一般地说,折叠)以外的所有目标,并将其包装在可能的中。例如
Just c <- preuse (clients.ix n)
只有c
use (clients.ix n)
Just c <- preuse (clients.ix n)