6.4.4 實現選項型別的操作
繫結(bind)和對映(map)的實現有類似的結構,因為,兩者都是依據選項值進行模式匹配的高階函式。我們來看一看 f# 和 c# 的實現,這是在 c# 中實現函式式概念的最好示例。我們先看一下清單 6.14,這是對映操作的實現。
清單 6.14 用 f# 和 c# 實現 map 操作
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
optionmap(this option
input, funcf) {
t v;
if (input.matchsome(out v))
return option.some(f(v));
else
return option.none();
程式首先檢查作為引數值給定的選項值,當值為 none,立即返回結果 none。注意,我們不能返回作為引數值的 none 值,因為型別可能不同;在 c# 版本中,更為明顯;結果的型別是 option,而引數的型別是 option。
當引數值匹配差別聯合 some 分支的值,得到的型別t 的值,使用提供的函式(或 func 委託),把它對映到型別r 的值。從操作返回值的型別應該是 option,需要再次使用 some 建構函式把這個值打包。
儘管對映和繫結操作的源**非常相似,但也有一些重要的差異。現在我們來看一下在清單 6.15 中的第二組操作。
清單 6.15 用 f# 和 c# 實現bind 操作
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
optionbind(this option
input, func> f) {
t value;
if (input.matchsome(out value))
return f(value);
else
return option.none();
繫結操作同樣從對作為引數值給定的選項值進行模式匹配開始,當選項值是 none 時,如同前面的情況一樣,立即返回 none;差別在於選項包含實際值的情況。我們再次應用從引數值得到的函式,但這一次,不需要把結果打包到some建構函式中;因為從函式返回的值已經是選項型別了,從型別簽名可以看出,這也正是我們要返回的型別。因此,即使在 some 分支,繫結操作仍可能返回 none,具體取決於使用者所提供的函式。
通常,f# 版本把原始值作為最後乙個引數值,這樣可以利用管道和散應用,而 c# 版本採用擴充套件方法。現在,我們看一下如何在 c# 中,使用新建立的方法,重寫前面的示例。
5 4 4 實現選項型別的操作
5.4.4 實現選項型別的操作 繫結和對映的實現有類似的結構,因為,兩者都是高階函式,模式匹配依據乙個選項值。我們來看一看 f 和 c 的實現,是在 c 中編碼函式概念的好示例。讓我們從清單 6.14 開始,顯示了對映操作的實現。listing 6.14 implementing the map o...
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...