中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

F#數據類型Discriminator Union如何理解

發布時間:2022-01-11 11:15:44 來源:億速云 閱讀:151 作者:柒染 欄目:編程語言

F#數據類型Discriminator Union如何理解,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

題外話:

我寫這個主要是希望更多的.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。還是首先看一個例子,這是我寫的一個簡單的生成二分查找樹的例子。

type Tree<'a> =       | Node of 'a * Tree<'a> * Tree<'a>      | Nil    let generateBinarySearchTree l =       let rec insert a = function             | Node(root,left,right) when a < root   -> Node(root, (insert a left), right)          | Node(root,left,right) when a > root   -> Node (root,left, (insert a right))                       | Nil -> Node(a, Nil,Nil)                            let rec loop acc = function          |[] -> acc          |hd::tl -> loop (insert hd acc) tl            loop Nil l   let tree1 = generateBinarySearchTree [5;3;9;4;6;7]

我們首先來看前三行,沒錯,這就是今天要重點介紹的F#數據類型:Discriminator Union

type Tree<'a> =       | Node of 'a * Tree<'a> * Tree<'a>      | Nil

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

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

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

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了吧

如果你認真讀到上一篇文章的話,接下來構建二分查找樹的代碼比較簡單,我就不解釋了。我們接下來看如何判斷某一個值是否在一個構建好的二分查找樹中。

let rec tryFind x = function      | Node(root,_,_) when x = root -> Some(x)      | Node(root,left,_) when x<root -> tryFind x left      | Node(root,_,right) when x > root -> tryFind x right      | _ -> None

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

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

type option<'a> =       |Some of 'a      |None

關于F#數據類型Discriminator Union如何理解問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

博客| 黄山市| 沛县| 横山县| 丰原市| 黔东| 安丘市| 五华县| 呼玛县| 息烽县| 江山市| 弥渡县| 黔西| 沙田区| 满洲里市| 南川市| 图木舒克市| 奈曼旗| 浦城县| 锡林郭勒盟| 璧山县| 湘乡市| 苍山县| 嘉善县| 吉林省| 潞城市| 安龙县| 清流县| 贡山| 台前县| 普陀区| 阿鲁科尔沁旗| 博客| 常熟市| 武定县| 寻乌县| 阳曲县| 宜都市| 安塞县| 龙井市| 钟山县|