7.1.1 使用 f# 記錄型別
記錄是帶標記元組(labeled tuples)。它他們將多個不同的元素儲存在乙個值中;此外,每個元素都有乙個可以用來訪問它的名字。在 f# 中,元素的名字叫字段(fields)。這在很多方面類似於 c 的記錄或結構構造,或者 c# 中的匿名型別。與匿名型別不同,記錄必須事先宣告。類似於匿名型別,記錄,在其基本的形式中,包含唯一屬性儲存資料;清單 7.1 顯示了表示矩形的這種宣告。
listing 7.1 representing a rectangle using a record type (f# interactive)
> type rect =
;; type rect = (...)
> let rc = ;;
val rc : rect = (...)
> rc.left + rc.width;;
val it : float32 = 110.0f
當宣告記錄型別時,我們必須指定欄位的型別和它的名字。在此例中,我們使用 float32 型別,它對應於 c# 中的 float 和 .net 的 system.single 型別,因為,在後面,我們需要這種型別的矩形。要建立 f# 記錄的值,在大括號中指定所有欄位的值。注意,我們不必寫出記錄型別名字,這是通過用字段的名字來自動推斷的,你可以看到,在我們的示例中,編譯器正確地推斷出我們要建立矩形型別的值。與 c# 中匿名型別的工作相比,這是不同的。如果編譯器基於欄位的名字,找不到任何適當的記錄型別,將報告錯誤。
我們在處理記錄時,需要讀它們的字段,但還需要更改欄位的值。例如,向右移動矩形。由於記錄是一種函式式的資料結構,它是不可變的,我們將轉而不得不用已修改的值建立乙個記錄。向右移動的矩形記錄,寫出來可能像這樣:
let rc2 =
所有的**都寫成這樣,會非常尷尬,因為,我們必須顯式複製儲存在記錄中的所有字段值。此外,最終可能需要新增新字段來記錄宣告,這可能打亂現有的所有**。f# 讓我們以簡潔的方式來表達這樣的思想,"複製現有的記錄,並作一些修改":
let rc2 =
使用 with 關鍵字,我們可以指定要更改的字段值,而所有其餘欄位會自動複製。這與前面的**具有相同的含義,但它要實際得多。
到目前為止,我們已經看到如何寫記錄的"原始"操作。當然,我們試圖以函式風格寫**,所以,我們真正想能夠用函式來操作記錄。
處理記錄
我們將在本章後面使用 rect 型別,需要兩個簡單的函式,來處理矩形。第乙個函式是通過從每一條邊上減去指定的寬度和高度,來縮小矩形,第二個是將我們的表示形式轉換成 system.drawing 命名空間中的 rectanglef 類。可以在清單 7.2 中看到兩個函式。
listing 7.2 functions for working with rectangles (f# interactive)
> open system.drawing;;
> let deflate(original, wspace, hspace) =
;; val deflate : rect * float32 * float32 –> rect
> let torectanglef(original) =
rectanglef(original.left, original.top,
original.width, original.height);;
val torectanglef : rect –> rectanglef
> ;;
val it : rectangle = (...)
> deflate(it, 20.0f, 10.0f);;
val it : rectangle =
從型別簽名可以看到,f# 編譯器正確推導出原始引數的型別是 rect 型別,編譯器使用在函式體中訪問的欄位名。如果我們有兩個記錄型別,並且僅使用由它們兩個共享的字段,就必須顯式指定其型別。我們可以使用型別注釋,在函式宣告中寫上 (original:rect)。通常,當使用 f# interactive 時,可以立即測試函式。當建立值時,沒我們有使用 let 繫結,所以,後面使用自動建立的值 it 來訪問。
總結一下,f# 的記錄是不可變的,可以使用 構造很容易地複製。如果我們在 c# 中,設計像這樣的資料結構,要使用類,偶爾會用到結構,用特殊的方法寫。在下一節中,我們將介紹如何做到這一點。
Oracle記錄型別(record 使用
record 儲存單行多列結構的資料.type語句定義記錄型別的語法形式 type 記錄名 is record field1 name data type not null default value fieldn name data type not null default value 例項 定...
5 3 4 F 中使用選項(option)型別
5.3.4 f 中使用選項 option 型別 我們常常需要描述這樣的理念,某些計算可能會返回未定義的值。在 c 中,通常用返回 null 空值 實現。不幸的是,使用 null 頻繁導致錯誤 可能輕鬆地編寫 假定方法不返回空,當這種假設是錯誤的,可以看到臭名昭著的 nullreference 異常。...
F 文字型別
型別 說明字尾或字首 示例sbyte 有符號 8 位整數 y86y 0b00000101y byte 無符號 8 位自然數 uy86uy 0b00000101uy int16 有符號 16 位整數 s86s uint16 無符號 16 位自然數 us86us intint32 有符號 32 位整數 ...