6.7.1 f# 中實現列表
雖然我們已經處理過 f# 中的列表,還在 c# 中實現了相同功能,但還沒有探索在 f# 中如何實現列表型別。當我們前面討論列表時,看到列表既可以表示為零(nil)值(空列表),也可以表示成 cons cell,包含乙個元素和對列表中的其餘部分的引用。
現在,如果我們看看上一章中的值的相簿,這與帶有兩個選項的可選值完全一樣。有一點稍微不同, 列表型別是遞迴的,這意味著,cons cell 包含型別為列表自身的值。清單 6.19 顯示了乙個型別定義,建立乙個的列表型別,與 f# 標準庫中的類似。
listing 6.19 definition of a functional list type (f#)
> type list<'t> =
| nil
| cons of 't * list<'t>
type list<'t> = (...)
> let list = cons(1, cons(2, cons(3, nil)));;
val list : list<'t>
這個型別寫作泛型型別,有單個型別引數,型別引數表示儲存在這個列表中值的型別。f# 中的選項值用差別聯合表示,並且這個特定的聯合有兩個識別器。第乙個表示乙個空列表,第二個表示乙個列表,有乙個元素(型別為 't), 和指向該列表其餘部分的引用,其型別遞迴地寫作 list<'t>。
該**示例中的最後一行顯示了如何建立乙個有三個元素的列表。指向 cons 建構函式的第乙個引數值總是乙個數字,第二個引數是乙個列表,依次使用另乙個 cons 或 the nil 識別器構建。內建的 f # 列表型別完全是用這種方式宣告的。先前,我們處理列表使用兩個基元。:: 建構函式對應於定義中的 cons, 表示與零相同的值。
一般情況下,建立遞迴的差別聯合型別是表示程式資料的一種常見方式,我們將在下一章中看到。列表型別介於簡單值與複雜的程式資料之間。這兩種方式ftjb可以解釋,具體取決於在程式中如何使用。我們還將看到遞迴聯合如何可以表示許多標準的設計模式,但現在,我們回到高階函式,它使列表更易於處理。
3 3 4 2用 F 求列表中數字的和
3.3.4.2用 f 求列表中數字的和 我們已經知道了用 c 實現的 現在,再嘗試用 f 實現同樣的功能。清單 3.16 是f 函式 sumlist,並用幾個f interactive 命令進行了測試。清單 3.16對列表中元素求和 f interactive let rec sumlist lis...
15 5 1 F 中實現的動畫形式
15.5.1 f 中實現的動畫形式 在本節中,我們將實現顯示動畫的窗體。在 f 中,特別有趣,因為,我們將在 f interactive 中使用它,建立與實驗動畫。在這裡,f 開發的典型風格是非常不同於 c 在 c 中,我們會實現窗體,建立動畫,編譯應用程式,然後執行。在 f 中,我們會實現窗體,把...
15 5 1 F 中實現的動畫形式
15.5.1 f 中實現的動畫形式 在本節中,我們將實現顯示動畫的窗體。在 f 中,特別有趣,因為,我們將在 f interactive 中使用它,建立與實驗動畫。在這裡,f 開發的典型風格是非常不同於 c 在 c 中,我們會實現窗體,建立動畫,編譯應用程式,然後執行。在 f 中,我們會實現窗體,把...