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 最後乙個引數必須用...