You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Lens从Array中删除指定索引元素?为何Array无At Lens实例?

用Lens删除数组指定索引元素 & Array无At实例的原因

用Lens实现数组索引删除的方法

要通过索引删除数组元素,你可以利用partsOf结合ix遍历器来实现。ix idx可以定位到数组中指定索引的单个元素,而partsOf能将遍历到的元素替换为一个列表——传入空列表就相当于删除该元素:

import Control.Lens

deleteByIndex :: Int -> [a] -> [a]
deleteByIndex idx = partsOf (ix idx) .~ []

示例调用:

deleteByIndex 1 [1,2,3,4] -- 结果: [1,3,4]

如果索引超出数组范围,这个操作不会改变原数组,符合安全遍历的预期。

为什么Array(Haskell列表)没有At Lens实例

At类型类的核心契约是:通过at k访问结构中的键k,当设置为Nothing时,仅删除键k对应的元素,且其他元素的键保持不变。但Haskell列表(即你说的Array)的索引是基于元素位置的连续整数,完全依赖于元素的顺序:

  • 删除索引n的元素后,原本索引n+1、n+2的元素会前移到n、n+1的位置,所有后续元素的索引都会改变。
  • 这直接违背了At类型类“删除元素不影响其他键”的设计前提,因此列表无法为At提供合法的实例。

与之对比,Map这类结构的键是独立于位置的,删除某个键后其他键的位置不受影响,所以Map能合法实现At实例。

内容的提问来源于stack exchange,提问作者amaille

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 19:52:09