我們的故事要從這個叫
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...