讀編程與類型系統筆記05_函數類型

来源:https://www.cnblogs.com/lying7/archive/2023/01/12/17045419.html
-Advertisement-
Play Games

視頻格式就是通常所說的.mp4,.flv,.ogv,.webm等。簡單來說,它其實就是一個盒子,用來將實際的視頻流以一定的順序放入,確保播放的有序和完整性。 ...


1. 策略模式

1.1. 在運行時從一組演算法中選擇某個演算法

1.1.1. 封裝一組演算法

1.1.2. 在運行時使用其中一個演算法

1.2. 把演算法與使用演算法的組件解耦

1.3. 面向對象實現

1.3.1. 慣例實現

1.3.2. IStrategy介面

1.3.3. ConcreteStrategy1類

1.3.4. ConcreteStrategy2類

1.3.5. 通過IStrategy介面使用演算法的Context類

1.3.6. 常見原因

1.3.6.1. 依賴介面的方法

1.3.6.2. 設計模式在20世紀90年代流行起來

1.3.6.3. 當時並不是所有主流編程語言都支持一等函數

1.4. 函數式實現

1.4.1. Context類

1.4.2. concreteStrategy1()函數

1.4.3. concreteStrategy2()函數

1.4.4. 更簡潔的實現

2. 函數的類型

2.1. 函數的簽名

2.2. 函數的實參類型和返回類型決定了函數的類型

2.3. 兩個函數接受相同的實參,並返回相同的類型

2.3.1. 函數具有相同的類型

3. 一等函數

3.1. 將函數賦值給變數,並像處理類型系統中的其他值一樣處理它們

3.2. 一等公民

3.2.1. 賦予它們與其他值相同的權利

3.2.2. 有類型

3.2.3. 可被賦值給變數

3.2.4. 可作為實參傳遞

3.2.5. 可被檢查是否有效

3.2.6. 在相容的情況下可被轉換為其他類型

4. 狀態機

4.1. 有一組狀態,以及狀態之間的轉移

4.2. 以給定狀態(也叫作開始狀態)開始;如果滿足特定條件,就能轉移到另外一個狀態

4.3. 經典的狀態機

4.3.1. 將狀態集合定義為一個枚舉

4.3.2. 跟蹤當前的狀態

4.3.3. 使用覆蓋所有可能狀態的switch語句來獲得所希望的行為

4.3.4. 使用switch語句的狀態機

4.3.4.1. 缺點

4.3.4.1.1. 狀態沒有與想要在每種狀態下運行的邏輯聯繫在一起
4.3.4.1.2. 狀態和轉移作為一個單獨的枚舉進行維護,有不同步的風險

4.4. 使用函數的狀態機

4.4.1. 狀態完全是由一個函數來表示

4.4.2. 不需要單獨跟蹤狀態

4.4.2.1. 狀態與處理邏輯保持同步

4.4.2.2. 去掉了枚舉

4.4.2.3. 去掉狀態屬性

4.4.2.4. 去掉處理轉交給合適方法的switch語句

4.4.3. 更簡潔的實現

4.4.3.1. 缺點:每種狀態關聯更多信息要顯式聲明可能的狀態和轉移

4.5. 使用和類型的狀態機

4.5.1. 把每種狀態表示為一個單獨的類型

4.5.2. 整個狀態機表示為可能狀態的一個和類型

4.5.3. 把狀態機分解到類型安全的組件中

4.5.4. 比依賴函數的實現更長

4.5.4.1. 優點:允許我們在每種狀態中添加屬性和成員,把它們組合在一起

4.6. 不使用switch語句的狀態機

5. 延遲計算

5.1. 可以傳遞函數而不是傳遞實際的值,併在需要值的時候調用這些函數

5.2. 純粹的面向對象結構可以實現,但是代碼比函數式多得多

5.3. 許多函數式編程語言共有的特征

5.3.1. 所有內容都是儘可能晚計算的

5.4. lambda

5.4.1. 匿名函數

5.4.2. 一次性函數

5.4.2.1. 只會引用這種函數一次,所以為其命名就成了多餘的工作

6. 立即計算

6.1. 立即得到並傳遞值,即使我們在以後決定丟棄該值

6.2. 命令式編程語言(如TypeScript、Java、C#和C++)

7. 一階函數

7.1. 普通函數

7.2. 接受一個或多個非函數實參並返回一個非函數類型的“標準”函數

8. 高階函數

8.1. 定義:把所有接受或返回其他函數的函數

8.1.1. 二階函數

8.1.1.1. 接受一個一階函數作為實參或者返回一個一階函數的函數

8.1.2. 三階函數

8.1.2.1. 接受二階函數作為實參或者返回二階函數的函數

8.2. 基礎演算法

8.2.1. map()

8.2.1.1. 給定某個類型的值的一個集合

8.2.1.2. 對其中每個值調用一個函數

8.2.1.3. 返回結果集合

8.2.1.4. 自製map

8.2.1.4.1. 一個T數組和一個函數作為實參
8.2.1.4.2. 該實參函數接受項目T作為實參,並返回U類型的一個值
8.2.1.4.3. 函數把結果添加到一個U數組中

8.2.1.5. C# System.Linq Select()

8.2.1.6. Java java.util.stream map()

8.2.2. filter()

8.2.2.1. 給定一個數據項集合和一個條件

8.2.2.2. 過濾掉不滿足該條件的數據項

8.2.2.3. 返回滿足該條件的數據項集合

8.2.2.4. 自製filter

8.2.2.4.1. 輸入數組的類型為T
8.2.2.4.2. 過濾函數接受T作為實參,並返回boolean結果
8.2.2.4.2.1. 謂詞

8.2.2.4.2.1.1. 接受一個實參並返回一個boolean的函數

8.2.2.4.3. 返回過濾後的輸出

8.2.2.5. C# System.Linq Where()

8.2.2.6. Java java.util.stream filter()

8.2.3. reduce()

8.2.3.1. 將所有集合項合併為一個值

8.2.3.1.1. 創建一個初始值
8.2.3.1.2. 遍歷集合併把每個數據項與累積項合併,不斷累積結果
8.2.3.1.3. 遍歷完集合後返回累積結果

8.2.3.2. 自製reduce

8.2.3.2.1. 泛型函數
8.2.3.2.1.1. 實參為T數組
8.2.3.2.1.2. 實參T類型的一個初始值

8.2.3.2.1.2.1. 需要處理輸入數組為空的情況

8.2.3.2.1.3. 實參一個接受兩個T類型的實參並返回T類型的結果

8.2.3.3. C# System.Linq Aggregate()

8.2.3.4. Java java.util.stream reduce()

8.2.3.5. 沒有么半群時

8.2.3.5.1. 考慮初始值是什麼
8.2.3.5.2. 在哪個方向上進行縮減

8.3. 抽象代數

8.3.1. 處理集合以及集合上的操作

8.3.2. T值集合上的一個操作

8.3.2.1. 類型T的一個操作接受兩個T作為實參,並返回另一個T,即(T, T) => T

8.3.3. 單位元

8.3.3.1. T的一個元素id

8.3.3.2. 操作op(x, id) == op(id, x) == x

8.3.3.3. id與其他任何元素合併起來,並不會改變其他元素

8.3.3.3.1. 操作是加法時,單位元是0
8.3.3.3.2. 操作是乘法時,單位元是1
8.3.3.3.3. 操作為字元串連接時,單位元是“”(空字元串)

8.3.4. 相關性

8.3.4.1. 操作的一個屬性

8.3.4.2. 對元素序列應用操作的順序並不重要,因為最終結果是相同的

8.3.4.3. op(x, op(y, z)) == op(op(x, y), z)

8.3.4.3.1. 加法
8.3.4.3.2. 乘法
8.3.4.3.3. 減法
8.3.4.3.4. 連接兩個字元串的首字母

8.3.5. 么半群(monoid)

8.3.5.1. 有一個單位元

8.3.5.2. 具有相關性

8.3.5.3. 不要求提供初始值

8.3.5.3.1. 在集合為空時預設使用單位元

8.3.6. 半群(semigroup)

8.3.6.1. 沒有單位元

8.3.6.1.1. 把初始值放到第一個元素的左邊或者最後一個元素的右邊很重要

8.3.6.2. 具有相關性


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Blazor WebAssembly初次訪問需要載入很多dll,體積較大,因此第一次載入比較慢。 針對此問題Microsoft提供了優化方案:壓縮 https://learn.microsoft.com/zh-cn/aspnet/core/blazor/host-and-deploy/webasse ...
  • 在C#里關於定時器類就有3個 1.定義在System.Windows.Forms里 2.定義在System.Threading.Timer類里 3.定義在System.Timers.Timer類里 System.Windows.Forms.Timer是應用於WinForm中的,它是通過Windows ...
  • 此筆記主要是記錄在 LVGL 中使用圖片的幾種方式,以及使用過程中遇到的問題。最近在 ARM linux 中使用 LVGL 時,發現載入圖片變得很卡,一開始還好,當連續載入的圖片變多後,特別是動畫的過程中直接無法看,折騰了一會直接懵逼了,嘗試了各種辦法都沒搞定,後來發現是我沒有好好看文檔,導致的問題 ...
  • 在進行Compose應用開發時,發現沒有下拉刷新上拉載入,沒有Android原生提供的SwipeRefreshLayout。 查看官方simple樣例(https://github.com/android/compose-samples),在官方樣例的基礎進行簡單封裝, 編寫的了ComposeRef ...
  • 需求效果:文本的高度為50dp,並且文字垂直居中 根據需求寫出如下代碼: Text(text = "你好,世界!", modifier = Modifier.height(50.dp), textAlign = TextAlign.Center) 運行後發現Text文字沒有垂直居中,設置textAl ...
  • 摘要:跨域,對後端工程師來說,可謂既熟悉又陌生。 本文分享自華為雲社區《後端老司機的跨域之旅》,作者: 勇哥java實戰分享。 跨域,對後端工程師來說,可謂既熟悉又陌生。 這兩個月我以架構師的角色參與一款教育產品的孵化,有了一段難忘的跨域之旅。 寫這篇文章,我想分享我在跨域這個知識點的經歷和思考,希 ...
  • 原文鏈接: 工作流引擎架構設計 最近開發的安全管理平臺新增了很多工單申請流程需求,比如加白申請,開通申請等等。最開始的兩個需求,為了方便,也沒多想,就直接開發了對應的業務代碼。 但隨著同類需求不斷增多,感覺再這樣寫可要累死人,於是開始了工作流引擎的開發之路。查找了一些資料之後,開發了現階段的工作流引 ...
  • 混沌工程是通過主動製造故障場景並根據系統在各種壓力下的行為表現確定優化策略的一種系統穩定性保障手段,簡單說就是通過主動註入故障的方式、提前發現問題,然後解決問題規避風險。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...