5.4.4 實現選項型別的操作
繫結和對映的實現有類似的結構,因為,兩者都是高階函式,模式匹配依據乙個選項值。我們來看一看 f# 和 c# 的實現,是在 c# 中編碼函式概念的好示例。讓我們從清單 6.14 開始,顯示了對映操作的實現。
listing 6.14 implementing the map operation in f# and c#
f# interactive
c#> let map f input =
match input with
| none –> none
| some(value) –>
some(f(value));;
val map :
('a -> 'b) –>
'a option -> 'b option
option map(this option
input, func f)
實現首先檢查給定的選項值作為引數值。當值為 none,它立即返回 none 作為結果。注意,我們不能返回作為引數值的 none 值,因為型別可能不同。在 c# 版本中,更為明顯。結果的型別是 option,而引數值的型別是 option。
當引數值的值,匹配差別【送別】聯合的 some 情況,就得到 t 型別的值,並使用提供的函式(或 func 委託),把它對映到 r 型別的值。因為,從這個操作返回的值的型別應該是 option,需要再次使用 some 建構函式把這個值打包。
對映和繫結操作的源**是很相似,但也有一些重要的差異。現在讓我們看一下,在清單 6.15 中的第二組操作。
listing 6.15 implementing the bind operation in f# and c#
f# interactive
c#> let bind f input =
match opt with
| none –> none
| some(value) -> f(value)
;; val bind :
('a -> 'b option)
-> 'a option -> 'b option
option bind(this option
input, funcf)
繫結操作同樣從模式匹配開始,依據對作為引數值給定的選項值。當選項值是 none 時,它立即返回 none,就像前面的情況一樣。區別在於,當選項攜帶實際值。我們再次應用來自引數值的函式,但這一次,不需要把結果打包到some建構函式中 。從函式中返回的值已經是乙個選項,並且可以從型別簽名中看出,這也正是我們想要返回的型別。這意味著,即使在 some 情況下,繫結操作仍可能返回 none,具體情況要取決於使用者所提供的函式。
通常,f# 版本把原始值作為最後乙個引數值,以啟用流及偏應用,而 c# 版本採用擴充套件方法。現在,我們看一下如何在 c# 中重寫前面的示例,使用新建立的方法。
在 c#中使用選項型別
擴充套件方法使我們可以用流暢的風格來編寫使用繫結和對映的**。因為,括號中的數字可能會造成混亂,因此,要注意對對映的呼叫是巢狀在 lambda 函式內部的,作為引數值給繫結的:
option readandadd()
在 c# 中,使用高階函式與顯式處理選項型別之間的區別更為重要。c# 不直接支援類似差別聯合之類的型別,但如果我們提供的型別有適當的處理函式,**將變得可讀。這是重要的一點,牢記,在 c# 中寫函式式程式:一些低階的構造可能感覺不自然的,但由於 lambda 函式,我們在 c# 中也可以編寫優雅的函式**。
到目前為止,我們已經看到了如何使用高階函式處理多值和可選值。在前一章中,我們談到了最後一種值是函式。在下一節,我們將看到,也可以寫非常有用的高階函式值來處理函式值。
6 4 4 實現選項型別的操作
6.4.4 實現選項型別的操作 繫結 bind 和對映 map 的實現有類似的結構,因為,兩者都是依據選項值進行模式匹配的高階函式。我們來看一看 f 和 c 的實現,這是在 c 中實現函式式概念的最好示例。我們先看一下清單 6.14,這是對映操作的實現。清單 6.14 用 f 和 c 實現 map ...
5 4 1 在 C 中實現選項型別
5.4.1 在 c 中實現選項型別 正如我們所看到的,在函式的程式設計中,選項型別是很重要的,我們也希望能夠在 c 中用函式風格 因此,需要選項型別的適當 c 實現。我們已經討論了如何在物件導向的語言中對差別聯合進行編碼,因此,該 的結構類似於我們剛才討論過的計畫型別。在option情況下,我們可以...
選項卡的實現
1 是指令,相當於v on 2 是繫結,相當於v bind 3 正常使用class class box divbox 4 三元表示式 條件 true false doctype html en utf 8 viewport content width device width,initial sca...