6 4 4 實現選項型別的操作

2021-06-26 18:06:16 字數 1577 閱讀 1976

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...