讀編程與類型系統筆記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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...