12.4 可选工作流(alternative workflows)

12.4 可选工作流(alternativeworkflows)

计算表达式(Computation expressions)是一种 F# 功能,部分灵感是来自Haskell 的单子(monads)。单子有个不好的名声,对于brain-bustingly 有困难的人来说,但是,也不用担心。我们将实现一组重要的方法,可以在 C# 中很好地处理 Option<T> 值,以及在 F# 中的类似做法,如何用优美的 F# 语法写一个简单日志记录器。

我们甚至可以不需要用到单子,就能完成这一切。因为本书是在更普遍的意义上讲述关于函数编程,我们想要介绍更多的 F# 功能,偶尔会介绍一些基础术语,这对于了解其他编程语言可能有所帮助。因此,可以跳过这些听起来很复杂的部分,直接进入下面的示例。你可能会惊讶地发现,我们以前已经解释过这一章单子的概念;事实上,你甚至在拿起这本书之前,就可能使用过它们:LINQ 是也基于单子的。

在第 6.7 节,我们讨论过选项值的绑定(bind)函数,学习过列表上类似的运算符。在 F# 库中,其标准的名字是 List.collect,因此说,Seq.collect 也是绑定运算符的一种形式时,一定不要感到诧异,但这次是处理序列。在本章,我们已经看到过,这个操作在 LINQ 查询和 F# 序列表达式中的重要性。下面是三个操作的类型签名:

Option.bind : (‘a -> option<‘b>)-> option<‘a> -> option<‘b>

List.collect : (‘a -> list<‘b>)-> list<‘a> -> list<‘b>

Seq.collect : (‘a -> #seq<‘b>)-> seq<‘a> -> seq<‘b>

作为参数值提供的函数,描述了对于包含在第二个参数值中的每个值(类型 ‘a),需要做的。对于列表和序列,输入序列中的每个元素都会调用这个函数;对于选项值,这个函数最多只执行一次,且在第二个参数值是 Some 值时。提醒一下:可以把选项值看作是,有零或一个元素的列表。

我们可以创建自定义的 LINQ 查询运算符,使用来处理我们自己的集合类型。对于只使用查询语法处理集合,没有任何限制。

时间: 2024-12-30 23:58:56

12.4 可选工作流(alternative workflows)的相关文章

第十二章 序列表达式和可选工作流

第十二章序列表达式和可选工作流 本章介绍 ■生成和处理序列值 ■处理 F# 序列表达式 ■理解单子和 LINQ 表达式 ■实现 F# 计算表达式 在我们开始讨论序列表达式之前,必须知道什么是序列(sequence),这也是数学的F# 术语.序列是有序的列表,可能包含无穷的元素.这一切听上去有点抽象,但也不用担心,我们已经熟悉这种类型了,在.NET 中表达同样概念的是:IEnumerable<T>. 在.NET 框架中有IEnumerable<T> 类型的主要原因,是它提供一种统一的

有用函数编程

<序> 感谢 关于本书 关于封面 第一部分 学习函数式思维 第一章 不同的思维 1.1 什么是函数式编程? 1.2 通往有用函数编程之路 1.3 用函数式编程提高生产力 1.3.1 函数范式 1.3.2 声明式编程风格 1.3.3 了解程序的执行 1.3.4 设计并发友好的应用程序 1.3.5 函数风格怎样形成代码 1.4 函数式编程演示样例 1.4.1 用声明式风格表达意图 1.4.1.1 用 LINQ 处理数据 1.4.1.2 用 XAML 描写叙述用户界面 1.4.1.3 声明式函数动画

12.3.3.1 序列表达式中的平面映射

假设我们有一个关于城市的元组列表,每个元组包含城市的名字和它所在的国家,另外,我们还有一个列表,是用户所选的城市.因此,我们可以这样表示样本数据: let cities = [ ("New York","USA"); ("London", "UK"); ("Cambridge","UK"); ("Cambridge", "USA") ] let e

SharePoint 2013 工作流之使用Visio设计篇

原文:SharePoint 2013 工作流之使用Visio设计篇 SharePoint 2013增强了工作流,不仅仅基于WorkFlow Foundation 4.0了,设计方式也不仅仅是Designer,还包括Visio中设计,下面我们就一个简单的例子,介绍下. 1.打开Visio,选择SharePoint 2013模板,如下图: 2.选择Microsoft SharePoint 2013 工作流,并点击创建,如下图: 3.打开工作流设计器,如下图: 和之前介绍的Designer设计,几乎一

SharePoint 2013 工作流设计之Designer 使用“可视化视图”

原文:SharePoint 2013 工作流设计之Designer 使用"可视化视图" SharePoint 2013增强了工作流功能,而Designer里面也添加了可视化设计视图,也就是类似Visio的设计视图(需要Visio 2013支持),下面我们简单介绍下,在可视化视图下,使用工作流. 1.创建列表工作流,选择“工作流测试列表”,如下图: 2.填写工作流名称,选择平台类型,这里我们选择SharePoint 2013 工作流: 3.选择“可视化设计器”视图,如下图: 特:需要安装

12.3.2.1 使用高阶函数

在 F# 中,使用 Seq 模块与 List 相同,而且,我们已经知道,如何在 C# 中使用 LINQ 扩展方法.而在使用列表和序列方面,有一个显著区别:序列是延迟的.直到从返回序列中取出元素时,处理代码才执行,尽管那样,它所做的工作,也只是为了返回结果所需要的.现在,我们用简单的代码段来演示一下: var nums1 = nums.Where(n => n%3 == 0) .Select(n => n * n) let nums1 = nums |> Seq.filter (fun n

MIME协议在邮件中的应用详解

1.定义 全称是多用途互联网邮件扩展(MIME,Multipurpose Internet Mail Extensions),在MIME出台之前,使用RFC 822只能发送基本的ASCII码文本信息,邮件内容如果要包括二进制文件.声音和动画等,实现起来非常困难,最为麻烦的是多家邮件服务器商间邮件的互发,如果没有一种统一的格式定义,想要互发需要投入巨大的人力物力.MIME提供了一种可以在邮件中附加多种不同编码文件的方法,弥补了原来的信息格式的不足.实际上不仅仅是邮件编码,现在MIME经成为HTTP

hibernate注解标签及解释

3. * @author liuguangyi 4. * @content  ejb3注解的API定义在javax.persistence.*包里面. 5. * 6. * 注释说明: 7. * @Entity -- 将一个类声明为一个实体bean(即一个持久化POJO类) 8. * @Id -- 注解声明了该实体bean的标识属性(对应表中的主键). 9. * @Table -- 注解声明了该实体bean映射指定的表(table),目录(catalog)和schema的名字 10. * @Col

TCP/IP协议族

TCP/IP协议 TCP/IP协议栈主要分为四层:应用层.传输层.网络层.数据链路层,每层都有相应的协议,现在几乎所有的操作系统都实现了TCP/IP协议栈.如下图 上图运输层应为传输层 所谓的协议就是双方进行数据传输的一种格式.整个网络中使用的协议有很多,所幸的是每一种协议都有RFC文档.在这里只对IP.TCP.UDP协议头做一个分析. 首先来看看在网络中,一帧 以太网数据包的格式: 在Linux 操作系统中,当我们想发送数据的时候,我们只需要在上层准备好数据,然后提交给内核协议栈 , 内核协议