Bow Optics入门:用Lens和Prism优雅操作不可变数据
Bow Optics入门用Lens和Prism优雅操作不可变数据【免费下载链接】bow Bow is a cross-platform library for Typed Functional Programming in Swift项目地址: https://gitcode.com/gh_mirrors/bow/bowBow是一个用于Swift的跨平台类型化函数式编程库它提供了强大的Optics组件帮助开发者以优雅的方式操作不可变数据。本文将带你快速掌握Lens和Prism这两种核心Optics工具让你轻松应对复杂数据结构的修改挑战。为什么需要Optics在函数式编程中不可变数据是核心原则之一。但当面对嵌套较深的数据结构时修改其中某个值就变得非常繁琐。例如要更新一个用户对象中地址的城市字段传统方式需要层层复制对象既不高效也不美观。Bow Optics提供了一种声明式的方式来访问和修改数据结构的特定部分就像为数据结构安装了光学镜片让你可以精准聚焦到需要操作的字段。Lens聚焦数据结构的特定字段Lens是一种能够聚焦到数据结构特定字段的Optics工具它本质上是一对函数get获取字段值和set设置字段值。通过Lens我们可以轻松访问和修改嵌套数据结构中的字段而无需手动复制整个对象。Lens的核心定义在Bow Optics中Lens的定义位于Sources/BowOptics/Lens.swiftpublic typealias LensS, A PLensS, S, A, A public class PLensS, T, A, B { private let getFunc: (S) - A private let setFunc: (S, B) - T public init(get: escaping (S) - A, set: escaping (S, B) - T) { self.getFunc get self.setFunc set } public func get(_ s: S) - A { ... } public func set(_ s: S, _ b: B) - T { ... } // 其他方法... }创建和使用Lens假设我们有以下数据结构struct User { let name: String let address: Address } struct Address { let street: String let city: String }我们可以创建一个Lens来聚焦到User的address字段let addressLens LensUser, Address( get: { $0.address }, set: { user, newAddress in User(name: user.name, address: newAddress) } )然后使用这个Lens来获取或修改用户的地址let user User(name: Alice, address: Address(street: Main St, city: New York)) let city addressLens.get(user).city // 获取城市 let updatedUser addressLens.set(user, Address(street: Oak Ave, city: Boston)) // 更新地址Lens的组合Lens最强大的特性之一是可组合性。我们可以将多个Lens组合起来创建一个能够聚焦到深层嵌套字段的Lenslet cityLens addressLens LensAddress, String( get: { $0.city }, set: { address, newCity in Address(street: address.street, city: newCity) } ) let updatedUser cityLens.set(user, Boston) // 直接更新城市Prism处理可选值和枚举类型Prism是另一种重要的Optics工具它适用于处理可选值和枚举类型。与Lens不同Prism处理的是可能不存在的值或只能在特定条件下访问的值。Prism的核心定义Prism的定义位于Sources/BowOptics/Prism.swiftpublic typealias PrismS, A PPrismS, S, A, A public class PPrismS, T, A, B { private let getOrModifyFunc: (S) - EitherT, A private let reverseGetFunc: (B) - T public init(getOrModify: escaping (S) - EitherT, A, reverseGet: escaping (B) - T) { self.getOrModifyFunc getOrModify self.reverseGetFunc reverseGet } public func getOrModify(_ s: S) - EitherT, A { ... } public func reverseGet(_ b: B) - T { ... } // 其他方法... }Prism有两个核心函数getOrModify尝试获取聚焦的值如果失败则返回原始值reverseGet从聚焦的值构建原始类型使用Prism处理可选值假设我们有一个可选类型的变量我们可以创建一个Prism来安全地访问它let optionalPrism PrismInt?, Int( getOrModify: { optional in optional.map(Either.right) ?? .left(nil) }, reverseGet: { $0 } ) let someValue: Int? 5 let noneValue: Int? nil optionalPrism.getOption(someValue) // Option.some(5) optionalPrism.getOption(noneValue) // Option.none() optionalPrism.reverseGet(10) // 10 as Int?使用Prism处理枚举类型Prism特别适合处理枚举类型。例如对于Result类型enum ResultSuccess, Failure: Error { case success(Success) case failure(Failure) } let successPrism PrismResultString, Error, String( getOrModify: { result in switch result { case .success(let value): return .right(value) case .failure(let error): return .left(.failure(error)) } }, reverseGet: { .success($0) } ) let successResult: ResultString, Error .success(Hello) let failureResult: ResultString, Error .failure(NSError(domain: com.example, code: 1)) successPrism.getOption(successResult) // Option.some(Hello) successPrism.getOption(failureResult) // Option.none() successPrism.reverseGet(World) // .success(World)何时使用Lens和PrismLens适用于访问和修改数据结构中必定存在的字段如结构体的属性。Prism适用于访问和修改可能不存在的值如可选类型、枚举的特定case。总结Bow Optics的Lens和Prism为Swift开发者提供了优雅处理不可变数据的强大工具。通过使用这些Optics你可以简化嵌套数据结构的访问和修改减少样板代码提高代码可读性编写更安全、更具表达力的函数式代码要开始使用Bow Optics只需将Bow库添加到你的项目中然后导入BowOptics模块即可。更多详细信息请参考官方文档和源代码。希望这篇文章能帮助你快速入门Bow Optics并在实际项目中应用这些强大的工具【免费下载链接】bow Bow is a cross-platform library for Typed Functional Programming in Swift项目地址: https://gitcode.com/gh_mirrors/bow/bow创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Win11Debloat:给Windows 11做一次彻底“卸重“,轻装出发的免费方案

Win11Debloat:给Windows 11做一次彻底“卸重“,轻装出发的免费方案

Win11Debloat:给Windows 11做一次彻底"卸重",轻装出发的免费方案 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various ot…

2026/10/8 22:37:15 阅读更多 →
终极指南:如何用 SteamAutoCrack 一键自动化破解 Steam DRM 游戏(含完整上手步骤)

终极指南:如何用 SteamAutoCrack 一键自动化破解 Steam DRM 游戏(含完整上手步骤)

终极指南:如何用 SteamAutoCrack 一键自动化破解 Steam DRM 游戏(含完整上手步骤) 【免费下载链接】Steam-auto-crack Steam Game Automatic Cracker 项目地址: https://gitcode.com/gh_mirrors/st/Steam-auto-crack 核心关键词与长尾…

2026/10/16 23:11:46 阅读更多 →
高速光模块常见问题解答FAQ

高速光模块常见问题解答FAQ

北亿纤通本文整理了网络工程师在光通信设备选型、安装调试与故障排查中反馈频率较高的问题,供采购与运维人员参考查阅。一、技术原理类Q1:单模光纤和多模光纤的区别是什么?A:核心区别在于纤芯直径与传输距离。单模光纤纤芯细&…

2026/10/16 1:52:04 阅读更多 →

最新新闻

Word转PDF自动生成目录全攻略:从样式大纲到批量处理与故障排查

Word转PDF自动生成目录全攻略:从样式大纲到批量处理与故障排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 1:45:27 阅读更多 →
读懂 sudo-rs 的 sudoers 配置:从第一次输密码到不再踩坑

读懂 sudo-rs 的 sudoers 配置:从第一次输密码到不再踩坑

读懂 sudo-rs 的 sudoers 配置:从第一次输密码到不再踩坑 【免费下载链接】sudo-rs A memory safe implementation of sudo and su. 项目地址: https://gitcode.com/GitHub_Trending/su/sudo-rs 刚把 sudo-rs 部署到生产机,敲了条命令被要密码&am…

2026/10/17 1:45:27 阅读更多 →
如何快速跑通 Nemotron-3-Super-120B-A12B-BF16-MTPv2:vLLM 加载 MTP 头的部署教程

如何快速跑通 Nemotron-3-Super-120B-A12B-BF16-MTPv2:vLLM 加载 MTP 头的部署教程

【免费下载链接】Nemotron-3-Super-120B-A12B-BF16-MTPv2 项目地址: https://ai.gitcode.com/hf_mirrors/nvidia/Nemotron-3-Super-120B-A12B-BF16-MTPv2 点击查看 免费下载 Nemotron-3-Super-120B-A12B-BF16-MTPv2 是 NVIDIA 为 Nemotron 3 Super 推出的独立 Mult…

2026/10/17 1:45:27 阅读更多 →
基于注意力机制的AGREE群组推荐模型解密与PyTorch实现

基于注意力机制的AGREE群组推荐模型解密与PyTorch实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 1:45:27 阅读更多 →
FPGA入门第一课:GPIO操作从点灯到按键消抖实战解析

FPGA入门第一课:GPIO操作从点灯到按键消抖实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 1:45:27 阅读更多 →
79LXX 系列三端负电源电压调节器

79LXX 系列三端负电源电压调节器

概述79LXX 系列三端负电源电压调节器是单片双极型线性集成电路,它有一系列固定的电压输出,适用于小于 100mA 电源供给的场合。采用 TO92、SOT89-3 的封装形式封装。二、主要特点最大输出电流为 100mA。固定输出电压分别为-5V;-6V;…

2026/10/17 1:44:26 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →