如何使用Monocle修改序列指定索引元素?Map可行但IndexedSeq报错
解决方法
Monocle确实支持修改序列指定索引的元素,你可以通过以下两种方式实现:
方式1:导入IndexedSeq的Index实例
Monocle默认未为IndexedSeq提供Index类型类实例,需显式导入对应模块。修改代码如下:
import monocle.syntax.all._ import monocle.collection.IndexedSeqIndex._ // 导入该实例以支持IndexedSeq的index操作 case class C(member: Int) val seq = IndexedSeq(C(0), C(1), C(2)) case class Container(seq: IndexedSeq[C]) val containedSeq = Container(seq) // 现在可正常编译运行 containedSeq.focus(_.seq).index(0).replace(C(10))
方式2:使用element方法
对于序列类型,Monocle提供了专门的element方法(返回Optional光学元件),无需额外导入:
import monocle.syntax.all._ case class C(member: Int) val seq = IndexedSeq(C(0), C(1), C(2)) case class Container(seq: IndexedSeq[C]) val containedSeq = Container(seq) // 通过element访问指定索引 containedSeq.focus(_.seq).element(0).replace(C(10))
补充说明
index方法依赖Index类型类:Map的Index实例默认导入,而IndexedSeq、List等序列类的实例需手动导入对应模块(如IndexedSeqIndex、ListIndex)。element是序列专属的索引访问方式:本质和导入Index实例后用index效果一致,均返回Optional(因索引可能越界,修改仅在索引有效时生效)。- 与Quicklens的差异:Monocle将Map和序列的索引访问做了区分,但通过上述方式可实现类似Quicklens
at方法的功能,且完全支持Scala 3。
内容的提问来源于stack exchange,提问作者Suma
相关产品推荐
相关产品推荐

