F 福利彩票双色球开奖结果
创始人
2024-04-29 09:30:22
0

题外话:

我写这个主要是希望更多的.Net开发人员能了解F#,能在看到F#代码时不被一堆奇怪的符号搞晕(其实也没几个奇怪的符号).我没有说过F#比别的语言好、会取代C#之类的话,只是希望更多的人能了解并开始使用F#(C#用的多了,了解下F#换换脑子也是挺不错的)。 写的例子、代码都比较简单,希望大家多多包涵。可能有朋友手头没有VSTS 2010 Beta1,这个没有关系,因为F#还有一个为VSTS 2008准备的独立安装包,大家可以在这里下载安装它。

F#数据类型之Discriminator Union简介

上节我们通过一个简单的例子了解了怎样在F#中声明变量,定义函数,并且用到了F#中两个重要的数据类型List和Array,今天我主要介绍F#中一个非常重要的immutable数据类型Discriminated Unions。还是首先看一个例子,这是我写的一个简单的生成二分查找树的例子。

  1. type Tree<'a> =   
  2.     | Node of 'a * Tree<'a> * Tree<'a>  
  3.     | Nil   
  4.  
  5. let generateBinarySearchTree l =   
  6.     let rec insert a = function     
  7.         | Node(root,left,right) when a < root   -> Node(root, (insert a left), right)  
  8.         | Node(root,left,right) when a > root   -> Node (root,left, (insert a right))               
  9.         | Nil -> Node(a, Nil,Nil)          
  10.               
  11.     let rec loop acc = function  
  12.         |[] -> acc  
  13.         |hd::tl -> loop (insert hd acc) tl  
  14.       
  15.     loop Nil l  
  16.  
  17. let tree1 = generateBinarySearchTree [5;3;9;4;6;7] 

我们首先来看前三行,没错,这就是今天要重点介绍的F#数据类型:Discriminator Union

  1. type Tree<'a> =   
  2.     | Node of 'a * Tree<'a> * Tree<'a>  
  3.     | Nil 

首先注意到我们这次使用的是type,而不是前面常用的let关键字。 F#中使用type关键字来定义用户自定义类型,在这里我们定义了一个类型Tree, 那么Tree后面的<'a>又是啥意思呢?可能有的朋友己经猜到了,它表示a是一个泛型占位符,在实际使用中,a可能是int型,也可能是string等等(注意别忘了a前面的单引号)。后面二行就是具体的Tree定义了,它表示我们定义的Tree有两种可能,有可能是Node,也有可能是Nil。 我们先来看***种情形

  1. Node of 'a * Tree<'a> * Tree<'a>  

它表示Node的类型是 'a * Tree<'a> * Tree<'a>, 那么这个又表示什么呢?其实它是F#中另外一种重要的immutable类型Tuple, Tuple很容易理解,它表示把一个数据集合在逻辑上看作是一个整体。看个例子大家就明白了(注意分隔符是逗号)

  1. let s2 = (1,"hello"

(在这里我们定义了一个类型为int * string的Tuple. 要使用它里面的值也很简单,我们可以声明新的变量并用s的值来初始化它们。 let i,s = s2就表示我们声明了int型变量i,它的值为1, string型变量s,它的值是2)

回到我们的例子中来, 'a * Tree<'a> * Tree<'a> 就很容易理解了,因为在定义Discriminated union时可以递归引用自己。

Tree的第二种情形Nil很简单,它表示一个什么都没有的空结点.

通过我上面详细的解释,我想大家也明白了什么是Discriminated union, 它表示一组有限的可选情形,并且每种情形都有自己的严格定义。回到我们上面的例子,Tree有两种情形,要么是 'a * Tree<'a> * Tree<'a>的Node,要么是一个空的Nil。大家也看到了它和Pattern matching结合使用非常频繁,这下明白为什么叫Discriminated union了吧

如果你认真读到上一篇文章的话,接下来构建二分查找树的代码比较简单,我就不解释了。我们接下来看如何判断某一个值是否在一个构建好的二分查找树中。

  1. let rec tryFind x = function  
  2.     | Node(root,_,_) when x = root -> Some(x)  
  3.     | Node(root,left,_) when x tryFind x left  
  4.     | Node(root,_,right) when x > root -> tryFind x right  
  5.     | _ -> None  

首先要注意我使用了五个'_',前面四个看起来好象和***的一个有些不一样。记得我在上一篇中说过'_'用在Pattern Matching中用来匹配所有别的情况,而且我说过F#里的Pattern Matching要比C#中的Switch强大,在这里我们就看到了它的强大之处,它可以在找到匹配后,为匹配的各部分绑定一个变量名来方便我们后面的调用,在绑定时如果我们仅仅对某些部分感兴趣,那么我们就可以使用'_'来代替我们不感兴趣的部分(注意'_'只能绑定一个对应部分,要对应两个我们就要敲两个'_','_').

其次我们注意到tryFind的返回值好象有两种情况呀,Some(x)和None,一个函数怎么能返回两种不同类型的值呢? 呵呵,忘记我们今天主要在讲Discriminated union了?这是个F#里事先定义好的一个discriminated union,它有自己的名字叫Option,它的定义非常简单,有了前面的基础,这个就不需要我解释了吧。 

  1. type option<'a> =   
  2.     |Some of 'a  
  3.     |None 

总结:今天我主要说了F#中非常重要的一种immutable类型Discriminated union,并顺带说了下另两个简单的类型Tuple和Option。简单的functional programming知识就剩下最重要function没有说了,下一篇我主要来说说F#里的函数,希望在下一篇后,大家不再觉得F#难懂难用了。

以上就介绍了F#数据类型之Discrimination union。本文来自hiber的博客:《结合实例学习F#(二) --基本数据类型Discriminated Unions》。

【编辑推荐】

  1. F#入门:基本语法,模式匹配及List
  2. C# Actor的尴尬与F#美丽外表下的遗憾
  3. 函数式编程语言F#:基于CLR的另一个头等编程语言
  4. Visual Studio 2010爆F#二进制兼容性问题
  5. 推荐Visual Studio 2010中F#的一些资源

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...