FP大串烧:SQL,LINQ,F#以及STL(1)

53 篇文章 14 订阅
18 篇文章 0 订阅
看看函数型编程范式是如何将这几种看似互不相关的技术紧密联系在一起的。
注:本文中
  • 函数型编程范式主要涉及集合(列表)操作。
  • 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)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值