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

如何使用Lens从[(A, Either B [C])]中获取[(A, C)]?

基于Lens的解决方案

针对你手里的my :: [(A, Either B [C])],要得到满足条件的[(A, C)],可以结合Lens的遍历、筛选工具,配合常规Haskell列表操作实现:

简洁实现方式

import Control.Lens

result :: [(A, C)]
result = my ^.. traverse 
               . filtered (\(_, e) -> case e of Right xs -> not (null xs); _ -> False)
               . to (\(a, Right (c:_)) -> (a, c))

更贴合Lens风格的写法

如果想更纯粹用Lens的棱镜(Prism)和组合子,可以这样写:

import Control.Lens

result :: [(A, C)]
result = my ^.. traverse 
               . filtered (\pair -> pair ^? _2 . _Right . filtered (not . null) /= Nothing)
               . (_1 &&& (_2 . _Right . to head))

关键逻辑说明

  • traverse:遍历列表中的每一个元组
  • filtered:只保留符合要求的元组——第二个元素是Right [C],且对应的列表非空
  • to / &&&:把筛选后的元组转换成(A, C)结构,前者是直接映射,后者是用Lens组合子分别提取第一个元素和Right列表的首个元素再配对

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:50:00