學習筆記十六——Rust Monad從頭學

🧠 零基礎也能懂的 Rust Monad:逐步拆解 + 三大定律通俗講解 + 實戰技巧


📣 第一部分:Monad 是什么?

Monad 是一種“包值 + 鏈操作 + 保持結構”的代碼模式,用來處理帶上下文的值,并方便連續處理。

? 用人話怎么說?

你可以把 Monad 想成“裝了值的容器”,它還帶了一套通用的處理流程,能幫你做以下三件事:

  1. 包裹值:比如用戶輸入 5,你包裝成 Some(5),表示“有值”。
  2. 自動判斷是否處理:值存在就處理,不存在就跳過。
  3. 統一結構,不出錯:你不管怎么處理,最后結構還保持不變(比如一直是 Option<T>)。

🧩 第二部分:Monad 三大組成要素

這三樣東西是判斷一個類型是不是 Monad 的“標準配件”。

要素名稱用通俗話解釋Rust 中的樣子
① 包裝器類型構造器把值“裝進盒子”Some(x)Ok(x)async { x }
② 起點函數單位函數(unit)把普通值變成最簡單的 Monad 容器Some(x)Ok(x)
③ 鏈接器綁定函數(bind)如果有值就繼續調用下一個操作.and_then(...)

這些特性讓我們可以放心大膽地“串”代碼邏輯。


🔍 第三部分:什么叫“上下文”和“結構保持不變”?

例子上下文的含義
Option<T>這個值可能為空(None)
Result<T,E>這個操作可能失敗
Future<T>這個值未來才會得到

? 舉個例子:

Some(5).and_then(|x| Some(x + 1)).and_then(|y| Some(y * 2))

這里的每一步都保留了 Option 結構,不會突然變成裸值 i32。這就叫結構不變


🧪 第四部分:三大定律徹底通俗講清楚!

? 左單位律(Left Identity)

定義:

unit(x).bind(f) == f(x)

用人話說:

把值放進盒子再處理,和你直接處理這個值,沒區別!

示例:

fn f(x: i32) -> Option<i32> {Some(x + 1)
}let a = Some(5).and_then(f); // 左邊:unit(x).bind(f)
let b = f(5);                // 右邊:直接調用 f(x)assert_eq!(a, b);            // 都是 Some(6)

口訣:“左邊裝進去再處理,和直接處理一樣。”


? 右單位律(Right Identity)

定義:

m.bind(unit) == m

用人話說:

如果你對值“啥也不干就原樣放回去”,等于什么都沒做。

示例:

let x = Some("hi");
let result = x.and_then(|v| Some(v)); // 就是 unit(v)assert_eq!(result, x); // 不變

口訣:“右邊原樣返回,啥也沒改變。”


? 結合律(Associativity)

定義:

m.bind(f).bind(g) == m.bind(|x| f(x).bind(g))

用人話說:

不管你是“先 f 后 g”還是“把 f 和 g 合起來一起處理”,結果一樣!

示例:

fn f(x: i32) -> Option<i32> { Some(x + 1) }
fn g(x: i32) -> Option<i32> { Some(x * 2) }let m = Some(3);
let a = m.and_then(f).and_then(g);
let b = m.and_then(|x| f(x).and_then(g));assert_eq!(a, b); // 都是 Some(8)

理解要點:

  • f(x) 是第一步
  • g(...) 是第二步
  • 兩種寫法是“逐步綁定”和“整體組合”的區別

口訣:“多步綁定能拆合,合成一起也不差。”


📘 第五部分:從例子理解 Option 是怎么應用 Monad 的

fn validate_email(email: Option<String>) -> Option<String> {email.and_then(|e| {if e.contains("@") {Some(e)} else {None}})
}

每行拆解:

  • Option<String>:這個郵箱可能存在也可能不存在
  • .and_then(...):如果有值就執行閉包,否則直接 None
  • |e| {...}:取出值 e 后判斷是否含有 @
  • 滿足條件返回 Some(e),否則返回 None

體現了什么?

  • ? 用 Some(email) 開始:unit(x)
  • ? 用 .and_then(...) 處理:bind
  • ? 最后返回的仍是 Option<String>:結構不變

🔧 第六部分:.map() vs .and_then() 有啥區別?

方法用法說明示例
.map()對值做處理,結果仍在容器內`Some(2).map(
.and_then()處理后返回另一個容器(嵌套)`Some(2).and_then(

.map() 相當于你“只動里面的值”,.and_then() 是你“根據值決定接下去是否繼續”。


🔁 第七部分:組合多個操作 - 用 Monad 串業務邏輯

fn parse_id(s: &str) -> Option<i32> {s.parse().ok()
}fn check_id(id: i32) -> Option<i32> {if id > 0 { Some(id) } else { None }
}fn query_user(id: i32) -> Option<String> {Some(format!("用戶{}", id))
}let user = Some("42").and_then(parse_id).and_then(check_id).and_then(query_user);

用人話解釋:

如果字符串能成功轉成數字、這個數字大于 0、還能找到用戶,就返回用戶名;否則中途停止。

這就是典型的:組合多個失敗可能的操作


🧾 第八部分:總結表格

類型類型構造器unit函數bind函數上下文解釋
OptionSome(x)Some(x)and_then可能沒有值
ResultOk(x)/Err(e)Ok(x)and_then成功/失敗狀態
Futureasync { x }asyncawait / then值尚未獲得

? 結語

掌握 Monad 不是為了炫技,而是為了安全、優雅、高復用地處理流程和異常

如果你能理解這三句話:

  • 我可以從值開始(左單位律)
  • 我可以隨時停下不處理(右單位律)
  • 我可以拆寫也能合寫(結合律)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77435.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77435.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77435.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PL/SQL登錄慢,程序連接Oracle 提示無法連接或無監聽

PL/SQL登錄慢&#xff0c;程序連接Oracle 提示無法連接或無監聽 錯誤提示&#xff1a;ORA-12541: TNS: 無監聽程序 的解決辦法&#xff0c; 現象&#xff1a;PL/SQL登錄慢&#xff0c;程序連接Oracle 提示無法連接或無監聽 監聽已經正常開起&#xff0c;但還是PL/SQL登錄慢或…

Windows10,11賬戶管理,修改密碼,創建帳戶...

在這里&#xff0c;我們使用微軟操作系統的一款工具:netplwiz 它可以非常便捷的管理用戶賬戶. 一:修改密碼(無需現在密碼) 01修改注冊表 運行命令&#xff1a;regedit 在地址欄輸入&#xff1a; HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Passwor…

電腦 BIOS 操作指南(Computer BIOS Operation Guide)

電腦 BIOS 操作指南 電腦的BIOS界面&#xff08;應為“BIOS”&#xff09;是一個固件界面&#xff0c;允許用戶配置電腦的硬件設置。 進入BIOS后&#xff0c;你可以進行多種設置&#xff0c;具體包括&#xff1a; 1.啟動配置 啟動順序&#xff1a;設置從哪個設備啟動&#x…

iOS 冷啟動時間監控:啟動起點有哪些選擇?

?? iOS 冷啟動時間監控&#xff1a;啟動起點有哪些選擇&#xff1f; 作者&#xff1a;侯仕奇 來源&#xff1a;sqi.io 在監控 iOS 冷啟動性能時&#xff0c;一個關鍵問題是&#xff1a;如何精確記錄 App 冷啟動的開始時間&#xff1f; 本文將對不同的“冷啟動起點”監控方式…

onlyoffice關閉JWT后依然報錯如何解決?

onlyoffice關閉JWT后依然報錯如何解決&#xff1f; 一、部署方式 我是以docker方式部署的&#xff0c;直接通過環境變量禁用了JWT&#xff0c;命令如下&#xff1a; docker run -d \--name onlyoffice-no-jwt \--restartalways \-p 8069:80 \-e JWT_ENABLEDfalse \onlyoffic…

rk3588 驅動開發(一)字符設備開發

3.字符設備驅動開發 3.1 什么是字符設備驅動 字符設備&#xff1a;就是一個個字節&#xff0c;按照字節流進行讀寫操作的設備&#xff0c;讀寫是按照先后順序的。 舉例子&#xff1a;IIC 按鍵 LED SPI LCD 等 Linux 應用程序調用驅動程序流程&#xff1a; Linux中驅動加載成功…

設計模式 --- 外觀模式

外觀模式是一種結構型設計模式&#xff0c;為復雜子系統提供??統一的高層接口??&#xff0c;通過定義一個外觀類來??簡化客戶端與子系統的交互??&#xff0c;降低系統耦合度。這種模式隱藏了子系統的復雜性&#xff0c;將客戶端與子系統的實現細節隔離開來&#xff0c;…

我的gittee倉庫

日常代碼: 日常代碼提交https://gitee.com/xinxin-pingping/daily-code 有需要的寶子們可自行讀取。

微服務調用中的“大對象陷阱”:CPU飆高問題解析與優化

背景 對幾十萬條用戶歷史存量數據寫入&#xff0c;且存在大對象的基礎上。kafka消費進行消費寫mysql超時。導致上游服務調用時異常&#xff0c;CPU飆高異常。 大對象解釋 大對象的定義與危害 1. 什么是大對象&#xff1f; JVM 內存分配機制&#xff1a;Java 中對象優先分配…

代碼隨想錄算法訓練營day6(字符串)

華子目錄 反轉字符串思路 反轉字符串II思路 替換數字思路 反轉字符串 https://leetcode.cn/problems/reverse-string/ 思路 使用雙指針&#xff0c;初始化時&#xff0c;left指向下標0的位置&#xff0c;right指向最后一個元素的下標當while left<right時&#xff0c;交換…

Oracle 19c新特性:OCP認證考試與職業躍遷的關鍵?

在數字化轉型的浪潮中&#xff0c;Oracle 19c作為數據庫領域的旗艦版本&#xff0c;不僅承載著技術革新的使命&#xff0c;更成為IT從業者職業進階的“黃金跳板”。無論是企業級應用的高可用性需求&#xff0c;還是云原生架構的快速迭代&#xff0c;Oracle 19c的智能化與多模型…

【MySQL數據庫入門到精通】

文章目錄 一、SQL分類二、DDL-數據庫操作1.查詢2.創建數據庫3.刪除數據庫4.使用數據庫 三、DDL-表操作1.查詢 一、SQL分類 根據功能主要分為DDL DML DQL DCL DDL:Date Definition Language數據定義語言&#xff1a;定義數據庫&#xff0c;表和字段 DML:Date Manipulatin Lan…

MCP服務端開發

MCP(Memory, Context, Planning)是一種增強AI系統認知能力的框架,通過整合記憶管理、上下文理解和規劃能力,可以顯著提升AI系統的表現。下面我將為您開發一個完整的MCP服務端。 概述 我們將使用Python開發一個基于FastAPI的MCP服務端,包含以下核心組件: Memory Manager…

前端:uniapp中uni.pageScrollTo方法與元素的overflow-y:auto之間的關聯

在uniapp中&#xff0c;uni.pageScrollTo方法與元素的overflow-y:auto屬性之間存在以下關聯和差異&#xff1a; 一、功能定位差異 ?uni.pageScrollTo? 屬于?頁面級滾動控制?&#xff0c;作用于整個頁面容器?34。要求頁面內容高度必須超過屏幕高度&#xff0c;且由根元素下…

基礎知識-指針

1、指針的基本概念 1.1 什么是指針 1.1.1 指針的定義 指針是一種特殊的變量&#xff0c;與普通變量存儲具體數據不同&#xff0c;它存儲的是內存地址。在計算機程序運行時&#xff0c;數據都被存放在內存中&#xff0c;而指針就像是指向這些數據存放位置的 “路標”。通過指針…

VS遠程Linux_CMake項目搭建

VS遠程Linux CMake項目搭建 準備工作 遠程計算機上安裝 gcc: 一個開源的編譯器集合, GCC支持多種編程語言的編譯&#xff0c;包括C、C、Objective-C、Fortran、Ada、Go、D和Javagdb: GDB&#xff08;GNU Debugger&#xff09;是一個功能強大的調試工具&#xff0c;主要用于調…

替代升級VMware | 云軸科技ZStack構建山西證券一云多芯云平臺

通過云軸科技ZStack Cloud云平臺&#xff0c;山西證券打造了敏捷部署、簡單運維的云平臺&#xff0c;不僅兼容x86、海光、鯤鵬三種異構服務器實現一云多芯&#xff0c;還通過云平臺虛擬化納管模塊納管原有VMware虛擬化資源&#xff0c;并對接第三方集中式存儲&#xff0c;在保護…

MATLAB - 模型預測控制器(MPC)的穩定性和魯棒性問題

系列文章目錄 目錄 系列文章目錄 前言 一、被控對象模型 二、初始控制器設計 三、改進初始設計 五、查看軟約束 七、參考 前言 您可以檢查模型預測控制器設計是否存在潛在的穩定性和魯棒性問題。具體操作如下 在命令行中&#xff0c;使用審查功能。在 MPC Designer 中&a…

《GPT-4.1深度解析:AI進化新標桿,如何重塑行業未來?》

一、GPT-4.1:AI 領域的 “全能戰士” 降臨 1.1 發布背景與戰略意義 在 OpenAI 的技術迭代版圖中,GPT-4.1 被賦予了 “承前啟后” 的關鍵角色。它不僅是 GPT-4o 的全面升級版,更被視為向 GPT-5 過渡的重要橋梁。2025 年 4 月 15 日的發布會上,OpenAI 宣布 GPT-4.1 系列模型…

MySQL+Redis實戰教程:從Docker安裝部署到自動化備份與數據恢復20250418

MySQLRedis實戰教程&#xff1a;從Docker安裝部署到自動化備份與數據恢復 一、前言 在企業應用中&#xff0c;對MySQL和Redis運維的要求越來越高&#xff1a; 不能僅是啟動就算部署運行穩定、隔離、訪問控制、備份恢復、安全可靠&#xff0c;才是 企業級的基本功能 本文將手…