2014-06-25 33 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