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

