文章目錄
Haskell代碼Prelude> map Char.toUpper "Hello World"<br />"HELLO WORLD" </p><p>Prelude> filter Char.isLower "Hello World"<br />"elloorld"</p><p>Prelude> foldl (-) 1 [4,8,5]<br />-16</p><p>Prelude> foldr (-) 1 [4,8,5]<br />0Haskell代碼說明
- list(列表)為 Haskell的內建集合類型,其成員類型種類不受限制,但所有成員的類型必須一致。
列表文法:[a1, a2, ..., an]
- 字串在Haskell中被實現為成員類型為字元的list。
如字串"Hello World" 其實就是列表['H','e','l','l','o',' ','W','o','r','l','d']
- 預定義函數map(映射)
參數:演算法函數f(單參數),列表[a1, a2, ..., an]
功能:返回新列表[b1, b2, ..., bn],其中bk = f(ak)
第1行代碼含義為:將字串"Hello World"中的所有字元改為大寫,返回所產生的新字串。
- 預定義函數filter(過濾)
參數:謂詞函數p(單參數),列表[a1, a2, ..., an]
功能:返回新列表[b1, b2, ..., bn2],其中bk = {am| p(am)=true}
第4行代碼含義為:過濾掉字串"Hello World"中所有非小寫字元,返回所產生的新字串。
- 預定義函數foldl(左捲起)
參數:演算法函數f(雙參數),初始狀態值v,列表[a1, a2, ..., an]
功能:返回 f( ... f(f(v, a1), a2), ..., an)
第7行代碼含義為:求 (((1-4)-8)-5) 的值。
- 預定義函數foldr(右捲起)
參數:演算法函數f(雙參數),初始狀態值v,列表[a1, a2, ..., an]
功能:返回 f(a1, f(a2, ... f(an, v) ... ))
第10行代碼含義為:求 (4-(8-(5-1))) 的值。
F#代碼open System</p><p>printfn "%A" (List.map Char.ToUpper ['H'; 'e'; 'l'; 'l'; 'o'; ' '; 'W'; 'o'; 'r'; 'l'; 'd'])<br />printfn "%A" (List.filter Char.IsLower ['H'; 'e'; 'l'; 'l'; 'o'; ' '; 'W'; 'o'; 'r'; 'l'; 'd'])<br />printfn "%d" (List.fold (-) 1 [4; 8; 5])<br />printfn "%d" (List.foldBack (-) [4; 8; 5] 1)</p><p>//['H'; 'E'; 'L'; 'L'; 'O'; ' '; 'W'; 'O'; 'R'; 'L'; 'D']<br />//['e'; 'l'; 'l'; 'o'; 'o'; 'r'; 'l'; 'd']<br />//-16<br />//0<br />F#代碼說明
- list(列表)為 F#的內建集合類型,其成員類型種類不受限制,但所有成員的類型必須一致。
列表文法:[a1; a2; ...; an]
- Haskell的 map 函數相當於F#的 List.map 函數。
- Haskell的 filter 函數相當於F#的 List.filter 函數。
- Haskell的 foldl 函數相當於F#的 List.fold 函數。
- Haskell的 foldr 函數相當於F#的 List.foldBack 函數。
C++代碼#include <numeric><br />#include <algorithm><br />#include <array><br />#include <iostream><br />#include <string><br />#include <functional></p><p>using namespace std;<br />using namespace std::placeholders;</p><p>int main()<br />{<br />string hw = "Hello World";<br />transform(hw.begin(), hw.end(), hw.begin(), toupper);<br />cout << hw << endl;</p><p>string hw2 = "Hello World";<br />hw2.erase(remove_if(hw2.begin(), hw2.end(), not1(ptr_fun(islower))), hw2.end());<br />cout << hw2 << endl;</p><p>array<int, 3> a = {4, 8, 5};<br />cout << accumulate(a.begin(), a.end(), 1, minus<int>()) << endl;<br />cout << accumulate(a.rbegin(), a.rend(), 1, bind(minus<int>(), _2, _1)) << endl;</p><p>return 0;<br />}</p><p>//HELLO WORLD<br />//elloorld<br />//-16<br />//0C++代碼說明
- Haskell的列表(list)用tr1庫的array組件來類比。
- Haskell的 map 函數用標準庫的transform演算法來類比。
- Haskell的 filter 函數用標準庫的remove_if演算法來類比。
- Haskell的 foldl 函數和 foldr 函數用標準庫的accumulate演算法來類比。