地道的F 函式式 vs 命令式

2022-07-04 22:24:15 字數 2732 閱讀 9493

我們的故事要從這個叫

stuart bowers

的傢伙開始,下圖中,他正拿著乙個來自

café

press

**的杯子喝著咖啡,此杯子正是他對函式式程式設計做出出色貢獻的象徵。

stuart

是amalga

(乙個微軟推出的醫療系統)專案的乙個開發者,也是微軟公司的一位全職員工。此人不寫部落格——此乃世界的一大損失也

…不管怎樣,他還是幫我審讀過

我寫的書

中的幾個章節,並且最近我們還有一次促膝長談,討論並分享怎樣才是乙個地道的

f#風格的話題。

問題提問:在編寫下面的**時,怎樣才是「正確的

f#方式」:

建立乙個共享的,可變得值並且生成聊個執行緒池用來累加乙個

list(f#

中的鍊錶)中的元素。(故意建立乙個競爭的環境,此乃這個**示例的關鍵所在。)

命令(?)式

讓我們以如何使用命令式方式來回答此問題作為開始。

open system.threading

let sumarray (arr : int) =

let total = ref 0

// add the first half

let thread1finished = ref false

threadpool.queueuserworkitem(

fun _ -> for i = 0 to arr.length / 2 - 1 do

total := arr.[i] + !total

thread1finished := true

) |> ignore

// add the second half

let thread2finished = ref false

threadpool.queueuserworkitem(

fun _ -> for i = arr.length / 2 to arr.length - 1 do

total := arr.[i] + !total

thread2finished := true

) |> ignore

// wait while the two threads finish their work

while !thread1finished = false ||

!thread2finished = false do

thread.sleep(0)

!total

然而,這也有一些弊端:

函式式(?)

方法現在讓我們來看看如何用更函式式的風格實現它。

open system.threading

let sumarray (arr : int) =

// define a location in shared memory for counting

let total = ref 0

// define two flags in shared memory

let thread1finished, thread2finished = ref false, ref false

// generate a lambda to sum a section of the array.

let sumelements (startindex,endindex) flag =

fun (_:obj) ->

for i = startindex to endindex do

total := arr.[i] + !total

flag := true

// divy up the array

let firsthalf = 0,(arr.length / 2 - 1)

let secondhalf = (snd firsthalf)+1,(arr.length - 1)

// generate delegates to sum portions of the array

let thread1delegate = sumelements firsthalf thread1finished

let thread2delegate = sumelements secondhalf thread2finished

[ thread1delegate; thread2delegate ] // queue up the delegates

|> list.map threadpool.queueuserworkitem // queue the use work items

|> ignore // ignore the results

// wait while the two threads finish their work

while !thread1finished = false ||

!thread2finished = false do

thread.sleep(0)

!total

讓我們先來看看這個函式式風格的弊端:

雖然可以說是混淆,但函式式風格提供了一些明顯的好處:

就我而言,我部分地支援

第乙個例子的簡單,但是第二個例子在呼叫範圍值的價值不應該被忽視。我最喜歡

f#的乙個地方是它是多正規化的語言,即通常情況下有乙個以上的方法來解決問題,這意味著你有多個選擇。

地道的F 函式式 vs 命令式

我們的故事要從這個叫 stuart bowers 的傢伙開始,下圖中,他正拿著乙個來自 caf press 的杯子喝著咖啡,此杯子正是他對函式式程式設計做出出色貢獻的象徵。stuart 是amalga 乙個微軟推出的醫療系統 專案的乙個開發者,也是微軟公司的一位全職員工。此人不寫部落格 此乃世界的一...

函式式程式語言F

文 高昂 作為微軟支援的第乙個函式式語言,f 在專案中被越來越多的開發者選用,8月的tiobe排行榜,f 挺進前二十。源於微軟研究院的f 語言因其優良的設計和強大的並行程式設計能力,正得到越來越多.net開發者的選用。在8月的tiobe語言流行度排行榜中,f 語言首次進入了前二十位。f 是微軟.ne...

命令式至函式式隨記(三)

english 函式式的思考中心就是分解問題,舉例來說,計算list長度命令式如下 def length list c 0 for i in list c 1 return c 將之改為函式式是許多介紹函式式的文章會有的範例 def length list return 0 if list else...