码迷,mamicode.com
首页 > 其他好文 > 详细

12.4 可选工作流(alternative workflows)

时间:2015-01-29 10:30:52      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:可选工作流   查询表达式   linq   函数编程   f#   

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 查询运算符,使用来处理我们自己的集合类型。对于只使用查询语法处理集合,没有任何限制。

 

12.4 可选工作流(alternative workflows)

标签:可选工作流   查询表达式   linq   函数编程   f#   

原文地址:http://blog.csdn.net/hadstj/article/details/43266727

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!