FP大串燒:SQL,LINQ,F#以及STL(2)

來源:互聯網
上載者:User
文章目錄
  • Aggregate(Count)
  • 彙總(計數)
  • Aggregate(Sum)
  • 彙總(求和)
  • Aggregate(Min)
  • 彙總(求最小值)
  • Aggregate(Max)
  • 彙總(求最大值)
  • Aggregate(Average)
  • 彙總(求平均值)
  • Aggregate(Simple)
  • 簡單彙總
  • Aggregate(Seed)
  • 帶種子的彙總
Aggregate(Count)彙總(計數)
  • 計數操作用於統計原創組合中符合某種條件的成員的個數,結果值為整數。
    計數操作在各語言中的實現方式如下表所示:

      Count
    SQL(SELECT) COUNT函數
    C#(LINQ) Count擴充方法
    F#(List) 由List.filter和List.Length函數聯合實現
    C++(STL) count, count_if等演算法函數
    Haskell(Prelude) 由filter和length函數聯合實現

    以下範例程式碼功能為:統計整形集合numbers中奇數成員的個數。

  • SQL(SELECT)
  • TABLE(INPUT): NUMBERS<br />FIELD DATA<br />NUM 5, 4, 1, 3, 9, 8, 6, 7, 2, 0</p><p>SELECT COUNT(*) AS ODDNUMBERS INTO RESULT FROM NUMBERS WHERE NUM MOD 2 = 1</p><p>TABLE(OUTPUT): RESULT<br />FIELD DATA<br />ODDNUMBERS 5

  • C#(LINQ)int[] numbers = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0};<br />int oddNumbers = numbers.Count(n => n % 2 == 1);<br />// oddNumbers = 5
  • F#(List)
  • let numbers = [5; 4; 1; 3; 9; 8; 6; 7; 2; 0]<br />let oddNumbers = numbers |> List.filter (fun num -> num % 2 = 1) |> List.length<br />// oddNumbers = 5

  • STL(C++)
  • int numbers[] = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0};<br />int oddNumbers = count_if(numbers, numbers + 10,<br />[](int num){return num % 2 == 1;});<br />// oddNumbers = 5

  • Haskell(Prelude)
  • Prelude> let numbers = [5, 4, 1, 3, 9, 8, 6, 7, 2, 0]<br />Prelude> let count f = length . filter f<br />Prelude> let oddNumbers = count (/n -> n `mod` 2 == 1) numbers<br />Prelude> oddNumbers<br />5

Aggregate(Sum)彙總(求和)
  • 求和操作用於計算原創組合中各成員的總和,結果類型與原創組合成員類型相同。
    求和操作在各語言中的實現方式如下表所示:

      Sum
    SQL(SELECT) SUM函數
    C#(LINQ) Sum擴充方法
    F#(List) List.sum, List.sumBy等函數
    C++(STL) accumulate演算法函數
    Haskell(Prelude) sum函數

    以下範例程式碼功能為:計算整形集合numbers中各成員的總和。

  • SQL(SELECT)
  • TABLE(INPUT): NUMBERS<br />FIELD DATA<br />NUM 5, 4, 1, 3, 9, 8, 6, 7, 2, 0</p><p>SELECT SUM(NUM) AS NUMSUM INTO RESULT FROM NUMBERS</p><p>TABLE(OUTPUT): RESULT<br />FIELD DATA<br />NUMSUM 45

  • C#(LINQ)int[] numbers = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0};<br />double numSum = numbers.Sum();<br />// numSum = 45
  • F#(List)
  • let numbers = [5; 4; 1; 3; 9; 8; 6; 7; 2; 0]<br />let numSum = List.sum numbers<br />// numSum = 45

  • STL(C++)
  • int numbers[] = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0};<br />int numSum = accumulate(numbers, numbers + 10, 0,<br />[](int acc, int num){return acc + num;});<br />// numSum = 45

  • Haskell(Prelude)
  • Prelude> let numbers = [5, 4, 1, 3, 9, 8, 6, 7, 2, 0]<br />Prelude> let numSum = sum numbers<br />Prelude> numSum<br />45

Aggregate(Min)彙總(求最小值)
  • 求最小值操作用於找出原創組合中最小的成員,結果類型與原創組合成員類型相同。
    求最小值操作在各語言中的實現方式如下表所示:

      Min
    SQL(SELECT) MIN函數
    C#(LINQ) Min擴充方法
    F#(List) List.min, List.minBy等函數
    C++(STL) min_element演算法函數
    Haskell(Prelude) minimum, minimumBy等函數

    以下範例程式碼功能為:找出整形集合numbers中最小的成員。

  • SQL(SELECT)
  • TABLE(INPUT): NUMBERS<br />FIELD DATA<br />NUM 5, 4, 1, 3, 9, 8, 6, 7, 2, 0</p><p>SELECT MIN(NUM) AS MINNUM INTO RESULT FROM NUMBERS</p><p>TABLE(OUTPUT): RESULT<br />FIELD DATA<br />MINNUM 0

  • C#(LINQ)int[] numbers = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0};<br />int minNum = numbers.Min();<br />// minNum = 0
  • F#(List)
  • let numbers = [5; 4; 1; 3; 9; 8; 6; 7; 2; 0]<br />let minNum = List.min numbers<br />// minNum = 0

  • STL(C++)
  • int numbers[] = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0};<br />int minNum = *min_element(numbers, numbers + 10);<br />// minNum = 0

  • Haskell(Prelude)
  • Prelude> let numbers = [5, 4, 1, 3, 9, 8, 6, 7, 2, 0]<br />Prelude> let minNum = minimum numbers<br />Prelude> minNum<br />0

Aggregate(Max)彙總(求最大值)
  • 求最大值操作用於找出原創組合中最大的成員,結果類型與原創組合成員類型相同。
    求最大值操作在各語言中的實現方式如下表所示:

      Max
    SQL(SELECT) MAX函數
    C#(LINQ) Max擴充方法
    F#(List) List.max, List.maxBy等函數
    C++(STL) max_element演算法函數
    Haskell(Prelude) maximum, maximumBy等函數

    以下範例程式碼功能為:找出整形集合numbers中最大的成員。

  • SQL(SELECT)
  • TABLE(INPUT): NUMBERS<br />FIELD DATA<br />NUM 5, 4, 1, 3, 9, 8, 6, 7, 2, 0</p><p>SELECT MAX(NUM) AS MAXNUM INTO RESULT FROM NUMBERS</p><p>TABLE(OUTPUT): RESULT<br />FIELD DATA<br />MAXNUM 9

  • C#(LINQ)int[] numbers = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0};<br />int maxNum = numbers.Max();<br />// maxNum = 9
  • F#(List)
  • let numbers = [5; 4; 1; 3; 9; 8; 6; 7; 2; 0]<br />let maxNum = List.max numbers<br />// maxNum = 9

  • STL(C++)
  • int numbers[] = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0};<br />int maxNum = *max_element(numbers, numbers + 10);<br />// maxNum = 9

  • Haskell(Prelude)
  • Prelude> let numbers = [5, 4, 1, 3, 9, 8, 6, 7, 2, 0]<br />Prelude> let maxNum = maximum numbers<br />Prelude> maxNum<br />9

Aggregate(Average)彙總(求平均值)
  • 求平均值操作用於計算原創組合中各成員的平均值,結果類型與原創組合成員類型相同。
    求平均值操作在各語言中的實現方式如下表所示:

      Average
    SQL(SELECT) AVG函數
    C#(LINQ) Average擴充方法
    F#(List) List.average, List.averageBy等函數
    C++(STL) 無對應演算法函數,由accumulate演算法函數間接實現
    Haskell(Prelude) 由sum和length函數聯合實現

    以下範例程式碼功能為:計算整形集合numbers中各成員的平均值。

  • SQL(SELECT)
  • TABLE(INPUT): NUMBERS<br />FIELD DATA<br />NUM 5, 4, 1, 3, 9, 8, 6, 7, 2, 0</p><p>SELECT AVG(NUM) AS AVERAGENUM INTO RESULT FROM NUMBERS</p><p>TABLE(OUTPUT): RESULT<br />FIELD DATA<br />AVERAGENUM 4.5

  • C#(LINQ)int[] numbers = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0};<br />double averageNum = numbers.Average();<br />// averageNum = 4.5
  • F#(List)
  • let numbers = [5.; 4.; 1.; 3.; 9.; 8.; 6.; 7.; 2.; 0.]<br />let averageNum = List.average numbers<br />// averageNum = 4.5

  • STL(C++)
  • int numbers[] = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0};<br />double averageNum = accumulate(numbers, numbers + 10, 0,<br />[](int acc, int num){return acc + num;}) / 10.;<br />// averageNum = 4.5

  • Haskell(Prelude)
  • Prelude> let numbers = [5, 4, 1, 3, 9, 8, 6, 7, 2, 0]<br />Prelude> let averageNum = fromIntegral (sum numbers) / fromIntegral (length numbers)<br />Prelude> averageNum<br />4.5

Aggregate(Simple)簡單彙總
  • 簡單彙總操作。
    簡單彙總操作在各語言中的實現方式如下表所示:

      Aggregate(Simple)
    SQL(SELECT) 無對應函數
    C#(LINQ) Aggregate擴充方法
    F#(List) List.reduce, List.reduceBack等函數
    C++(STL) accumulate演算法函數
    Haskell(Prelude) foldl1, foldr1等函數

    以下範例程式碼功能為:計算雙精確度浮點數集合doubles中所有成員的積。

  • SQL(SELECT)
  • C#(LINQ)double[] doubles = {1.7, 2.3, 1.9, 4.1, 2.9};<br />double product = doubles.Aggregate((runningProduct, nextFactor) => runningProduct * nextFactor);<br />// product = 88.330809999999985
  • F#(List)
  • let doubles = [1.7; 2.3; 1.9; 4.1; 2.9]<br />let product = List.reduce (fun runningProduct nextFactor -> runningProduct * nextFactor) doubles<br />// product = 88.33081

  • C++(STL)
  • double doubles[] = {1.7, 2.3, 1.9, 4.1, 2.9};<br />double product = accumulate(doubles + 1, doubles + 5, doubles[0],<br />[](double runningProduct, double nextFactor){return runningProduct * nextFactor;});<br />// product = 88.330809999999985

  • Haskell(Prelude)
  • Prelude> let doubles = [1.7, 2.3, 1.9, 4.1, 2.9]<br />Prelude> let productOfDoubles = foldl1 (/runningProduct nextFactor -> runningProduct * nextFactor) doubles<br />Prelude> productOfDoubles<br />88.33080999999999

Aggregate(Seed)帶種子的彙總
  • 帶種子的彙總操作。
    帶種子的彙總操作在各語言中的實現方式如下表所示:

      Aggregate(Simple)
    SQL(SELECT) 無對應函數
    C#(LINQ) Aggregate擴充方法
    F#(List) List.fold, List.foldBack等函數
    C++(STL) accumulate演算法函數
    Haskell(Prelude) foldl, foldr等函數

    以下範例程式碼功能為:從賬戶中扣除提款額(忽略大於存款的提款項目),計算賬戶餘額。

  • SQL(SELECT)
  • C#(LINQ)double startBalance = 100.0;<br />int[] attemptedWithdrawals = { 20, 10, 40, 50, 10, 70, 30 };<br />double endBalance =<br /> attemptedWithdrawals.Aggregate(startBalance,<br /> (balance, nextWithdrawal) =><br /> ((nextWithdrawal <= balance) ? (balance - nextWithdrawal) : balance));<br />// endBalance = 20.0
  • F#(List)
  • let startBalance = 100.0<br />let attemptedWithdrawals = [20; 10; 40; 50; 10; 70; 30]<br />let endBalance = List.fold (fun balance nextWithdrawal2 -><br /> let nextWithdrawal = float nextWithdrawal2<br /> if nextWithdrawal <= balance then balance - nextWithdrawal<br /> else balance) startBalance attemptedWithdrawals<br />// endBalance = 20.0

  • C++(STL)
  • double startBalance = 100.0;<br />int attemptedWithdrawals[] = {20, 10, 40, 50, 10, 70, 30};<br />double endBalance = accumulate(attemptedWithdrawals, attemptedWithdrawals + 7,<br />startBalance, [](double balance, int nextWithdrawal){<br />return ((nextWithdrawal <= balance) ? (balance - nextWithdrawal) : balance);});<br />// endBalance = 20.000000000000000

  • Haskell(Prelude)
  • Prelude> let startBalance = 100.0<br />Prelude> let attemptedWithdrawals = [20, 10, 40, 50, 10, 70, 30]<br />Prelude> let endBalance = foldl (/ balance nextWithdrawal2 -> let nextWithdrawal = fromIntegral nextWithdrawal2 in if nextWithdrawal <= balance then balance - nextWithdrawal else balance) startBalance attemptedWithdrawals<br />Prelude> endBalance<br />20.0

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.