自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

F#數(shù)據(jù)類型:Discriminator Union

開(kāi)發(fā) 后端
本文介紹了一個(gè)十分重要的F#數(shù)據(jù)類型:immutable的Discriminated Unions。它表示一組有限的可選情形,并且每種情形都有自己的嚴(yán)格定義。

題外話:

我寫(xiě)這個(gè)主要是希望更多的.Net開(kāi)發(fā)人員能了解F#,能在看到F#代碼時(shí)不被一堆奇怪的符號(hào)搞暈(其實(shí)也沒(méi)幾個(gè)奇怪的符號(hào)).我沒(méi)有說(shuō)過(guò)F#比別的語(yǔ)言好、會(huì)取代C#之類的話,只是希望更多的人能了解并開(kāi)始使用F#(C#用的多了,了解下F#換換腦子也是挺不錯(cuò)的)。 寫(xiě)的例子、代碼都比較簡(jiǎn)單,希望大家多多包涵??赡苡信笥咽诸^沒(méi)有VSTS 2010 Beta1,這個(gè)沒(méi)有關(guān)系,因?yàn)镕#還有一個(gè)為VSTS 2008準(zhǔn)備的獨(dú)立安裝包,大家可以在這里下載安裝它。

F#數(shù)據(jù)類型之Discriminator Union簡(jiǎn)介

上節(jié)我們通過(guò)一個(gè)簡(jiǎn)單的例子了解了怎樣在F#中聲明變量,定義函數(shù),并且用到了F#中兩個(gè)重要的數(shù)據(jù)類型List和Array,今天我主要介紹F#中一個(gè)非常重要的immutable數(shù)據(jù)類型Discriminated Unions。還是首先看一個(gè)例子,這是我寫(xiě)的一個(gè)簡(jiǎn)單的生成二分查找樹(shù)的例子。

  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] 

我們首先來(lái)看前三行,沒(méi)錯(cuò),這就是今天要重點(diǎn)介紹的F#數(shù)據(jù)類型:Discriminator Union

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

首先注意到我們這次使用的是type,而不是前面常用的let關(guān)鍵字。 F#中使用type關(guān)鍵字來(lái)定義用戶自定義類型,在這里我們定義了一個(gè)類型Tree, 那么Tree后面的<'a>又是啥意思呢?可能有的朋友己經(jīng)猜到了,它表示a是一個(gè)泛型占位符,在實(shí)際使用中,a可能是int型,也可能是string等等(注意別忘了a前面的單引號(hào))。后面二行就是具體的Tree定義了,它表示我們定義的Tree有兩種可能,有可能是Node,也有可能是Nil。 我們先來(lái)看***種情形

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

它表示Node的類型是 'a * Tree<'a> * Tree<'a>, 那么這個(gè)又表示什么呢?其實(shí)它是F#中另外一種重要的immutable類型Tuple, Tuple很容易理解,它表示把一個(gè)數(shù)據(jù)集合在邏輯上看作是一個(gè)整體??磦€(gè)例子大家就明白了(注意分隔符是逗號(hào))

  1. let s2 = (1,"hello"

(在這里我們定義了一個(gè)類型為int * string的Tuple. 要使用它里面的值也很簡(jiǎn)單,我們可以聲明新的變量并用s的值來(lái)初始化它們。 let i,s = s2就表示我們聲明了int型變量i,它的值為1, string型變量s,它的值是2)

回到我們的例子中來(lái), 'a * Tree<'a> * Tree<'a> 就很容易理解了,因?yàn)樵诙xDiscriminated union時(shí)可以遞歸引用自己。

Tree的第二種情形Nil很簡(jiǎn)單,它表示一個(gè)什么都沒(méi)有的空結(jié)點(diǎn).

通過(guò)我上面詳細(xì)的解釋,我想大家也明白了什么是Discriminated union, 它表示一組有限的可選情形,并且每種情形都有自己的嚴(yán)格定義。回到我們上面的例子,Tree有兩種情形,要么是 'a * Tree<'a> * Tree<'a>的Node,要么是一個(gè)空的Nil。大家也看到了它和Pattern matching結(jié)合使用非常頻繁,這下明白為什么叫Discriminated union了吧

如果你認(rèn)真讀到上一篇文章的話,接下來(lái)構(gòu)建二分查找樹(shù)的代碼比較簡(jiǎn)單,我就不解釋了。我們接下來(lái)看如何判斷某一個(gè)值是否在一個(gè)構(gòu)建好的二分查找樹(shù)中。

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

首先要注意我使用了五個(gè)'_',前面四個(gè)看起來(lái)好象和***的一個(gè)有些不一樣。記得我在上一篇中說(shuō)過(guò)'_'用在Pattern Matching中用來(lái)匹配所有別的情況,而且我說(shuō)過(guò)F#里的Pattern Matching要比C#中的Switch強(qiáng)大,在這里我們就看到了它的強(qiáng)大之處,它可以在找到匹配后,為匹配的各部分綁定一個(gè)變量名來(lái)方便我們后面的調(diào)用,在綁定時(shí)如果我們僅僅對(duì)某些部分感興趣,那么我們就可以使用'_'來(lái)代替我們不感興趣的部分(注意'_'只能綁定一個(gè)對(duì)應(yīng)部分,要對(duì)應(yīng)兩個(gè)我們就要敲兩個(gè)'_','_').

其次我們注意到tryFind的返回值好象有兩種情況呀,Some(x)和None,一個(gè)函數(shù)怎么能返回兩種不同類型的值呢? 呵呵,忘記我們今天主要在講Discriminated union了?這是個(gè)F#里事先定義好的一個(gè)discriminated union,它有自己的名字叫Option,它的定義非常簡(jiǎn)單,有了前面的基礎(chǔ),這個(gè)就不需要我解釋了吧。 

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

總結(jié):今天我主要說(shuō)了F#中非常重要的一種immutable類型Discriminated union,并順帶說(shuō)了下另兩個(gè)簡(jiǎn)單的類型Tuple和Option。簡(jiǎn)單的functional programming知識(shí)就剩下最重要function沒(méi)有說(shuō)了,下一篇我主要來(lái)說(shuō)說(shuō)F#里的函數(shù),希望在下一篇后,大家不再覺(jué)得F#難懂難用了。

以上就介紹了F#數(shù)據(jù)類型之Discrimination union。本文來(lái)自hiber的博客:《結(jié)合實(shí)例學(xué)習(xí)F#(二) --基本數(shù)據(jù)類型Discriminated Unions》。

【編輯推薦】

  1. F#入門:基本語(yǔ)法,模式匹配及List
  2. C# Actor的尷尬與F#美麗外表下的遺憾
  3. 函數(shù)式編程語(yǔ)言F#:基于CLR的另一個(gè)頭等編程語(yǔ)言
  4. Visual Studio 2010爆F(xiàn)#二進(jìn)制兼容性問(wèn)題
  5. 推薦Visual Studio 2010中F#的一些資源
責(zé)任編輯:yangsai 來(lái)源: hiber的博客
相關(guān)推薦

2010-01-15 08:33:13

F#F#類型推斷F#教程

2010-01-26 08:25:06

F#語(yǔ)法F#教程

2022-12-30 12:02:59

數(shù)據(jù)

2010-01-07 10:04:18

F#函數(shù)式編程

2010-04-07 16:51:59

F#

2009-08-19 09:42:34

F#并行排序算法

2011-06-09 09:52:41

F#

2009-11-16 09:05:46

CodeTimer

2009-12-04 09:16:44

Visual Stud

2012-11-06 10:01:35

ContinuatioF#

2010-03-26 19:22:08

F#代理

2009-12-14 09:04:10

F#運(yùn)算符

2009-09-10 14:18:59

Functional F#

2019-08-12 11:40:48

數(shù)據(jù)庫(kù)SQLite3數(shù)據(jù)類型

2016-08-18 14:13:55

JavaScript基本數(shù)據(jù)引用數(shù)據(jù)

2014-01-05 17:08:09

PostgreSQL數(shù)據(jù)類型

2010-07-22 17:57:40

2009-08-13 17:25:21

F#入門

2009-12-11 13:59:35

F#

2010-08-10 17:17:59

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)