如何使用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
相关产品推荐
相关产品推荐

