Haskell 用镜头索引访问矢量元素

Haskell 用镜头索引访问矢量元素,haskell,vector,haskell-lens,Haskell,Vector,Haskell Lens,我正在寻找一种方法,使用镜头库引用向量的元素 让我试着用一个简化的代码示例来解释我要实现的目标 我在这个monad transformer堆栈中工作(其中StateT是重点,其他一切都不重要) MyState有很多字段,但其中一个字段是客户端向量,它是我定义的数据类型: data MyState = MyState { ... , _clients :: V.Vector ClientT } 每当我需要

我正在寻找一种方法,使用镜头库引用向量的元素

让我试着用一个简化的代码示例来解释我要实现的目标

我在这个monad transformer堆栈中工作(其中StateT是重点,其他一切都不重要)

MyState有很多字段,但其中一个字段是客户端向量,它是我定义的数据类型:

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)])
导入控制。镜头(使用)

c
clients.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)