8 3 1 函式的記錄

2021-05-26 08:47:04 字數 2385 閱讀 6248

8.3.1 函式的記錄

我們已經看到乙個處理多個函式的方式。在前面的示例中,我們返回乙個函式元組作為結果,可以用相同的技術,來表示有新的報表功能的應用程式。我們說,這個報表函式取客戶端、列印一些內容到螢幕上,返回 unit 作為結果。使用這種表示,行為列表的型別將是

((client -> bool) * (client -> unit)) list

開始,看起來有點可怕,很複雜,函式沒有名字,**不具可讀性。在前面的示例中,這並不是乙個大問題,因為,這個函式只在本地使用,但是,這個清單是我們的應用程式的乙個關鍵資料結構,所以,它應該盡可能清晰。使**更具可讀性的乙個簡單的解決方案,是使用記錄型別,而不是元組。我們可以像這樣來定義它:

type clienttest =

此**定義了兩個欄位的記錄,兩者都是函式。這只是以相同方式,像任何其他型別一樣使用函式的另乙個例子。這個宣告類似於很簡單的物件(或介面),我們將在以後討論這種相似性。首先,讓我們看一下清單 8.11,顯示了如何建立使用較早前宣告的記錄表示檢查的列表。

listing 8.11 creating tests with reporting (f#)

let checkcriminal(client) = client.criminalrecord = true

let reportcriminal(client) =

printfn "checking 'criminal record' of '%s' failed!" client.name

let checkincome(client) = client.income < 30000

let reportincome(client) =

printfn "checking 'income' of '%s' failed (%s)!" 

client.name "less than 30000"

let checkjobyears(client) = client.yearsinjob < 2

let reportjobyears(client) =

printfn "checking 'years in the job' of '%s' failed (%s)!"

client.name "less than 2"

let testswithreports =

[ ;

; ;

(* more tests... *) ]

清單 8.11 是一系列的 let 繫結。為使**更具可讀性,我們沒有使用 lambda 函式,而是把所有的檢查定義為普通的 f# 函式。對於每個檢查,我們已經定義乙個有字首 check 的函式和乙個字首 report 的函式。如果在 f# interactive 中輸入**,可以看到這個函式型別對應到 clienttest 記錄型別的型別。最後乙個操作建立乙個檢查列表。我們需要為每個條件建立乙個記錄,儲存兩個相關函式,並建立乙個包含這個記錄值的列表。

我們也要更新檢查特定客戶的函式。首先找到這些失敗的檢查(使用 check 字段),然後,讓它們列印結果 (使用 report 字段)。清單 8.12 顯示這個修改函式,以及根據我們示例客戶執行它時的輸出。

listing 8.12 testing a client with reporting (f# interactive)

> let testclientwithreports(client) =

let issues =

testswithreports

|> list.filter (fun tr -> tr.check(client))

let suitable = issues.length <= 1 

for i in issues do

i.report(client)

printfn "offer loan: %s"

(if (suitable) then "yes" else "no")

;; val testclientwithreports : client -> unit

> testclientwithreports(john);;

checking 'years in the job' of 'john doe' has failed (less than 2)!

offer loan: yes

自清單 8.5 以來,testclient 函式只略有改變。第乙個變化是在選擇那些檢查失敗的行中。這個清單現在是記錄的集合,所以,我們必須使用儲存在 check 欄位中的函式來檢查客戶。第二個改變是,早先,我們感興趣的只是在一些未能通過的檢查。這一次,我們還需要列印有關這個失敗的詳細資訊,使用命令式的 for 迴圈實現,為所有失敗的檢查呼叫 report 函式。

**的當前版本的乙個問題是,在建立一些檢查時,我們不得不寫非常相似的函式。讓我們來解決它,以減少不必要的**重複。

mysql 記錄函式 mysql 函式記錄

條件查詢 case case when then when then when then else end1.簡單case函式寫法 注意 的位置 select case when 1 then 男 when 0 then 女 else 保密 end as text from user 2.case搜...

sql的函式記錄

1 sql中擷取字串函式 1.substr string,start position,length 求子字串,返回字串 substr abcdefg 0 返回 abcdefg,擷取所有字元 substr abcdefg 2 返回 cdefg,擷取從c開始之後所有字元 substr abcdefg ...

功能函式記錄

include int execlp const char file,const char arg,char 0 函式說明 execlp 會從path 環境變數所指的目錄中查詢符合引數file的檔名,找到後便執行該檔案,然後將第二個以後的引數當做該檔案的argv 0 argv 1 最後乙個引數必須用...