6 4 2 使用 bind 函式

2021-05-25 07:37:29 字數 1353 閱讀 4573

6.4.2 使用 bind 函式

下一步,我們想消除外層的模式匹配。這樣做,使用 option.map 是不可能的,因為,該函式總是輸入值 none 轉換到 輸出值 none,輸入值 some 轉換到輸出到攜帶另乙個值的 some。在外層的模式匹配中,我們要做的事情很不一樣。即使輸入值是 some,仍可能返回 none,如果讀第二個輸入失敗。這意味著,我們指定為引數值的 lambda 函式的型別不應該是 'a -> 'b,而是 'a ->'b option。

像這樣的操作在函式程式設計的術語中,稱為繫結(bind),它由標準的 f# 庫提供。讓我們**它的簽名,看看此函式做了什麼:

> option.bind;;

val it : (('a -> 'b option) -> 'a option -> 'b option) = (...)

繫結和對映的型別簽名中的區別只是在於函式的型別引數,正如我們剛才討論。了解只使用這個型別的函式的行為,是函式程式設計師非常重要的技能。在這種情況下,型別為我們提供了函式可以做什麼的很好線索,如果我們假定,它的行為合理。我們可以分析所有的情況,以推斷出函式的行為規範:

■ 輸入值為 none,繫結不能執行提供的函式,因為,它不能安全地獲取型別 'a 的值,從而立即返回 none。

■ 輸入值為 some,可攜式別 'a 的值 x,繫結可以呼叫提供的函式,用 x 作為引數值。它還可以返回 none,但是,乙個更合理的行為,是在可能時,呼叫該函式。有兩種不同的情況,取決於作為引數值的給定函式返回什麼:

— 如果該函式返回 none,繫結操作沒有型別 'b 的值,所以,它必須返回 none 作為整體的結果。

— 如果該函式返回 some(y),那麼,繫結型別 'b 的值 y,只在這種情況下,返回 some 結果,因此,結果是 some(y)。

使用繫結,我們現在可以寫外層的模式匹配,因為,它給我們的一種方法,以返回未定義的值 (none),即使在成功讀取第乙個輸入時。清單 6.11 顯示了 readandadd 的最終版本。

listing 6.11 adding two options using bind and map (f#)

let readandadd2() =

readinput() |> option.bind (fun num –>

readinput() |> option.map ((+) num) )

讀取第乙個輸入後,我們把它傳遞給繫結操作,執行給定的 lambda 函式,只在輸入包含乙個值時。在此 lambda 函式內部,我們讀第二個輸入,並把它對映到乙個結果值。該操作用於對映第乙個輸入與這個值的相加。在此清單中,我們使用加法運算子來寫這個操作,和偏應用,而不是顯式指定 lambda 函式。如果你對比清單 6.10 的**,可以看到,這個肯定更簡潔。現在,讓我們更詳細地分析它的工作原理。

6 使用bind 和connect 函式

socket 函式用來建立套接字,確定套接字的各種屬性,然後伺服器端要用 bind 函式將套接字與特定的ip位址和埠繫結起來,只有這樣,流經該ip位址和埠的資料才能交給套接字處理 而客戶端要用 connect 函式建立連線。bind 函式的原型為 int bind int sock,struct s...

bind()函式 listen()函式

bind 函式 include include int bind int sockfd,const struct sockaddr addr,socklen t addrlen 12 3sockfd是返回socket函式的返回值 addr 傳入引數 struct sockaddr addr addr...

bind函式詳解

前面我們已經說了,套接字也建立了,地方 也定義了,下面就需要將socket放置在這個 地方 tcp 將他們緊緊地 在一起,用bind函式吧,我們來看看函式原型 int pascal far bind socket s,const struct sockaddr far addr,int namele...