2014-06-25 32 views
1

我正在閱讀Tao Liu的「C#開發人員的F#」一書。在頁面139有一個觀察者模式的示例。我不確定微軟是否會或陶會允許我發佈完整列表。但這裏是我試圖包裹頭部的部分。需要幫助瞭解這裏正在做什麼

// subscribe to a notification function 
member this.Subscribe notifyFunction = 
    let wrap f i = f i ; i 
    notify <- wrap notifyFunction >> notify 

特別是let wrap f i = f i; i

我知道分號是下一條語句分隔,以便i後存在本身分號是它的標誌是的返回值訂閱

它看起來像wrap是一個函數,它將f和i作爲參數f是一個接受一個參數的函數,並且在wrap的定義中,f以i作爲參數被調用。

在下一行換行提供了一個複合函數而不是兩個參數。

有人能幫我理解嗎?我看着它在FSI,我看到下面

val wrap : f:('a -> unit) -> i:'a -> 'a 

這在我看來,wrap有兩個論據之一是f的功能,其中一個是從使用中推斷出一個類型,沒有返回值,第二個參數到wrap是類型a本身,它再次根據用法推斷幷包裝返回類型a的值。

這一切的所有組合都把我扔了。有人能給我一個簡單的方法來理解這一點嗎?

回答

2

你的wrap分析是正確的:它只是一種方式,推動一些副作用到身份功能(有點氣味恕我直言)的

我認爲更好的方式來理解,這可能功能是:

let wrap (action : 'a -> unit) : 'a -> 'a = 
    fun a -> action a 
      a 

下一行

notify <- wrap notifyFunction >> notify 

很奇怪 - 它就像x = x + 1 - 它會更改notify函數(應該是一個可變變量?)在調用notifyFunction之前,它將執行前面所做的任何操作。

在沒有看到代碼的其餘部分,我只能猜測: 我想只有beeing像

let mutable notify = fun _ ->() 

notify開始現在,只要你第一次調用Subscripe與動作f: 'a ->()代碼將改變notify是相當於這個:

let notify a = 
    f a 
    () 

f'第二個電話會給你相當於這樣的東西:

let notify a = 
    f' a 
    f a 
    () 

等等......

這會工作,但請:不要做這樣的事情 - 這是不可讀的,它不是你應該處理的事情在F#

+0

你有相當挑剔的技能一路。你得到的通知聲明完全正確 – fahadash

+0

不需要太多的技能......它都是在類型中;) – Carsten

+0

你確定答案或有什麼你不明白? – Carsten