程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#函數式編程中的尺度高階函數詳解

C#函數式編程中的尺度高階函數詳解

編輯:C#入門知識

C#函數式編程中的尺度高階函數詳解。本站提示廣大學習愛好者:(C#函數式編程中的尺度高階函數詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C#函數式編程中的尺度高階函數詳解正文


作甚高階函數

      年夜家能夠對這個名詞其實不熟習,然則這個名詞所表達的事物倒是我們常常應用到的。只需我們的函數的參數可以或許吸收函數,或許函數可以或許前往函數,固然靜態生成的也包含在內。那末我們就將這類函數叫做高階函數。然則明天我們的題目其實不是高階函數,而是尺度高階函數,既然加上了這個尺度,就意味著在函數式編程中有一套尺度的函數,便於我們每次挪用。而明天我們將會引見三個尺度函數,分離為Map、Filter、Fold。

 Map

這個函數的感化就是將列表中的每項從A類型轉換到B類型,並構成一個新的類型。上面我們可以看看在FCSLib中是若何完成的:

信任許多人應當都可以或許看懂這段代碼,僅僅只是輪回list數據。然後挪用convert函數轉換,最初經由過程yield將其構成一個列表前往。上面我們經由過程一個簡略的例子來演示下若何應用這個尺度高階函數:

我們經由過程聲清楚明了一個數組data,然後應用map函數將個中的ID提掏出來,零丁構成一個列表。

 Filter

      經由過程名字應當可以或許猜出他年夜概的寄義了,就是用來過濾數據的。信任一些人可以或許依據下面寫出這個尺度高階函數的詳細完成,固然這裡不論讀者有無寫出,我們都來看看FCSLib中是若何完成的:

      這裡我們只是少了一個泛型參數,對應的第一參數的是可以或許吸收T類型前往bool類型的函數(Predicate也是.NET自帶的,能夠我們用慣了FuncAction,而且應用Func<T,bool>也能夠完成一樣的後果。),而語句重要是在輪回後挪用了predicate去斷定能否知足前提,假如知足前提則前往。

 Fold

      這個尺度高階函數能夠會比擬難,由於它分為了左折疊和右折疊兩種。吸收的參數有三個,分離是肇端值,累加函數,列表。年夜致的履行進程就是在第一次挪用我們的累加函數時將肇端值作為一個參數,而列表中的第一個值作為第二個參數去挪用我們的累加函數,累加函數盤算出成果,而這個成果將作為下一次挪用累加函數時的第一參數,而第二個參數則是列表中的下一項,以此類推。所以經由過程這個高階函數我們可以直接盤算出列表中每項數據累加後的成果,而在FCSLib中的詳細完成則以下所示:

      經由過程檢查源代碼我們也能夠得出之前的履行流程,在第一次的時刻v的值為startValue,而以後就會將accmulator函數的前往值保留進v,如許下一次履行accmulator時就作為第一個參數傳入。上面我們經由過程一個簡略的例子來看看若何應用:

 左折疊完成以後對應的還有一個右折疊,固然依據名字也能夠猜出。就是從list的末尾開端停止輪回,所以我們可以如許來完成FoldR:

這裡還要指出的就是左折疊和右折疊是最經常使用的算法之一,他完整可以完成像我們之前引見過的Map和Filter,而只需依照上面這類方法寫便可:

      這裡我們就是應用Fold函數的一個特征來完成的,由於累加函數每次都邑將上一次盤算得出的成果傳遞給下一個累加函數(new List<R>()我們直接將其作為肇端值傳入),最初我們都邑經由過程return x將這個列表前往,如許下一次再挪用這個累加函數以後x仍然是統一個列表。對應的還有Filter的完成:

而詳細的挪用方法則和Map,Filter是分歧的,並沒有甚麼特殊年夜的差別。

 關於Linq中的Map、Filter和Fold

其實函數式編程曾經在不知不覺中漸漸的進入到我們的生涯中,其實我們常常在Linq中應用的selectwhereaggregate就是對應著函數式編程中的map、filter和fold。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved