看看函数型编程范式是如何将这几种看似互不相关的技术紧密联系在一起的。
注:本文中
- 函数型编程范式主要涉及集合(列表)操作。
- SQL主要涉及SELECT语句。
- LINQ主要涉及LINQ to Objects,示例代码取自Visual Studio自带的C# Samples。
- F#主要涉及list和Seq库函数。
- STL指C++标准库,主要涉及算法部分。
Restriction(Filtering)
限制(过滤)
- 限制(过滤)操作用于对原始集合施加某种限制,过滤掉其中不满足条件的成员,即结果集合只包含满足条件的成员。
限制(过滤)操作在各语言中的实现方式如下表所示:
Restriction SQL(SELECT) WHERE子句 C#(LINQ) where子句或者Where扩展方法 F#(List) List.filter函数 C++(STL) remove, remove_copy, remove_if, remove_copy_if等算法函数 Haskell(Prelude) filter函数 Java8(stream) filter方法
以下示例代码功能为:过滤掉整形集合numbers中不小于5的成员,将结果存放在lowNums集合中。 - SQL(SELECT)
- C#(LINQ)
- F#(List)
- C++(STL)
- Haskell(Prelude)
- Java8(stream)
Projection
映射
- 映射操作用于对原始集合各成员施加某种操作,结果集合的大小与原始集合大小相同,其成员与原始集合成员存在一一对应关系。
映射操作在各语言中的实现方式如下表所示:
Projection SQL(SELECT) SELECT子句 C#(LINQ) select子句或者Select扩展方法 F#(List) List.map函数 C++(STL) transform, for_each等算法函数 Haskell(Prelude) map函数 Java8(stream) map方法
以下示例代码功能为:对整形集合numbers的各成员实施加一操作,将结果存放在numsPlusOne集合中。 - SQL(SELECT)
- C#(LINQ)
- F#(List)
- C++(STL)
- Haskell(Prelude)
- Java8(stream)
Ordering
排序
- 排序操作用于对原始集合按某种条件进行排序,结果集合有序,其大小与原始集合大小相同。
排序操作在各语言中的实现方式如下表所示:
Ordering SQL(SELECT) ORDER BY子句 C#(LINQ) orderby子句或者OrderBy, OrderByDecending, ThenBy, ThenByDecending等扩展方法 F#(List) List.sort, List.sortBy等函数 C++(STL) sort算法函数 Haskell(Data.List) sort, sortBy等函数 Java8(stream) sorted方法
以下示例代码功能为:将字符串集合words从小到大排序,结果存放在sortedWords集合中。 - SQL(SELECT)
- C#(LINQ)
- F#(List)
- C++(STL)
- Haskell(Data.List)
- Java8(stream)
Grouping
分组
- 分组操作用于对原始集合按某一基准进行分组,结果集合为二维,第一维存放索引(键值),第二维存放键值所对应的各成员。
分组操作在各语言中的实现方式如下表所示:
Grouping SQL(SELECT) GROUP BY子句 C#(LINQ) group... by...子句或者GroupBy扩展方法 F#(Seq) Seq.groupBy函数 C++(STL) 无对应算法函数,由for_each算法函数间接实现 Haskell(Prelude) 无对应函数
How to group similar items in a list using Haskell?Java8(stream) groupingBy方法
以下示例代码功能为:对整形集合numbers进行分组,分组基准为各成员除以5后得到的余数。 - SQL(SELECT)
- C#(LINQ)
- F#(Seq)
- C++(STL)
- Haskell(Prelude)
- Java8(stream)
Quantifier(Any)
量词Any
- 量词Any用于判断原始集合中是否存在满足某种条件的成员,结果为逻辑值真或假。
量词Any的逻辑判断功能在各语言中的实现方式如下表所示:
Quantifier(Any) SQL(SELECT) ANY函数 C#(LINQ) Any扩展方法 F#(List) List.exists函数 C++(STL) any_of算法函数 Haskell(Prelude) any函数 Java8(stream) anyMatch方法
以下示例代码功能为:判断字符串集合words中是否存在包含“ei”的单词。 - SQL(SELECT)
- C#(LINQ)
- F#(List)
- C++(STL)
- Haskell(Prelude)
- Java8(stream)
Quantifier(All)
量词All
- 量词All用于判断原始集合中是否所有成员均满足某种条件,结果为逻辑值真或假。
量词All的逻辑判断功能在各语言中的实现方式如下表所示:
Quantifier(All) SQL(SELECT) ALL函数 C#(LINQ) All扩展方法 F#(List) List.forall函数 C++(STL) all_of, none_of等算法函数 Haskell(Prelude) all函数 Java8(stream) allMatch方法
以下示例代码功能为:判断整形集合numbers是否所有成员均为奇数。 - SQL(SELECT)
- C#(LINQ)
- F#(List)
- C++(STL)
- Haskell(Prelude)
- Java8(stream)