6 3 處理計畫

2021-06-26 16:53:58 字數 2034 閱讀 5327

6.3 處理計畫

在本節,我們要把上一節的技術應用到可選值。在處理元組時,我們發現使用函式,有助於處理元組中的元素;類似地,處理可選值時,同樣需要使用高階函式,對可選值中的乙個或多個進行某種操作。我們接著上一章的示例,從計畫型別開始,然後,看一下選項型別。

在前面的章節中,我們實施了乙個表示事件計畫的型別。在 f# 中,使用差別聯合schedule(計畫)實現,包含三種可選項;三個可選項識別器分別是never、once 和 repeatedly(從不,一次和多次)。在 c# 中,用抽象類 schedule 表示,有乙個名為 tag 的屬性,和乙個派生類,表示三個選項。在本節,我們會新增處理計畫的高階函式。

假設現在有乙個應用程式,想用使用這個計畫,最常用操作(尤其是在當今繁忙世界)重新安排計畫的事件。比如,把所有已知的事件推遲一周,或者把預定的事件從星期一推遲到星期二。要明確地把這些寫出來,可能很困難,因為必須要為計畫的三種不同型別都提供**。

如果我們這樣考慮問題,只根據原來的時間計算出新的時間,而不改變計畫的其他任何屬性;清單 6.7 就實現了這樣乙個函式。

清單 6.7 計畫型別的對映操作 (f# interactive)

> let mapschedule reschedulefuncschedule =

matchschedule with

|never -> never

|once(eventdate) -> once(reschedulefunc(eventdate))

|repeatedly(startdate, interval) –>

repeatedly(reschedulefunc(startdate),interval)

val mapschedule : (datetime -> datetime)-> schedule –> schedule  [1]

操作稱為 mapschedule,是因為它針對計畫所包含的所有日期和時間資訊,都執行某個操作。當選擇 never 時,直接返回 never,而不重新計算;當是 once 時,給定的函式作為引數值,用於計算新的時間;當計畫用 repeatedly 表示時,函式用於計算出事件第一次發生的時間,保持事件之間原有的週期。

如果看一下型別簽名[1],可以發現,第乙個引數是函式,引數和返回都是 datetime,這用於計算事件的新計畫時間,原計畫是最後乙個引數,這樣的引數順序,使這個函式有可能使用管道運算子進行呼叫,正如我們前面元組對映所做的一樣。清單 6.8 顯示了我們如何使用這個函式處理計畫集合。

清單6.8 使用 mapschedule 函式重訂計畫 (f# interactive)

> let schedules =

[never; once(datetime(2008, 1, 1));

repeatedly(datetime(2008,1, 2), timespan(24*7, 0, 0)) ];;  [1]

val schedules : schedule list

> for s in schedules do

letnewschedule = s |> mapschedule (fun d -> d.adddays(7.0))  [2]

printfn"%a" newschedule

never                               | [3]

once 8.1.2008 0:00:00                 |

repeatedly (9.1.2008 0:00:00,7.00:00:00)  |

我們首先建立用來測試的計畫列表[1]。注意,我們在構建.net 物件datetime 和 timespan 時,省略了 new 關鍵字,這只是f# 在處理簡單型別時,在語法上的簡化,就像這裡的兩個。

建立列表之後, 我們遍歷所有的計畫。在下一行[2],我們使用 mapschedule 函式,把所有的計畫推遲一周。日期的改變,由返回新的 datetime 物件的lambda 函式指定。當然,可以在這個函式裡面實現更複雜的邏輯,執行不同的重新安排。原計畫使用管道運算子,作為最後乙個引數值傳遞。可以看到[3],這個操作改變了 once 計畫的日期,以及使用 repeatedly 選項計畫的第一次發生日期。

6 3 處理計畫

6.3 處理計畫 在本節中,我們將把上一節的技術應用到可選為值。在處理元組時,我們發現寫函式,有助於處理元組中的乙個元素。同樣,處理可選值時,需要高階函式,在乙個或多個可選值上執行某種操作。我們接著上一章的示例,我們從計畫型別開始,然後,看一下選項型別。在前面的章節中,我們實施了乙個型別,表示事件的...

6 3 1 處理計畫列表

6.3.1 處理計畫列表 在前面的示例中,因為我們想要列印新的計畫,因此,使用了命令式的 for 迴圈 如果想要建立包含新的計畫列表,可以使用 list.map 函式,就像這樣 let newschedules list.map fun s s mapschedule fun d d.adddays...

7 1 1 1 處理記錄

7.1.1.1 處理記錄 我們在本章後面還要用到rect 型別,有兩個簡單的函式來處理矩形。第乙個函式是縮小矩形,通過從每一條邊上減去指定的寬度和高度,第二個函式是把我們的矩形表示形式轉換成 system.drawing 命名空間中的 rectanglef 類。清單 7.2 中是這兩個函式。清單 7...