需要帮助了解这里做了什么

时间:2014-06-25 06:21:49

标签: f#

我正在读刘涛的“F#for C#Developers”一书。在页139上有一个观察者模式的示例。我不确定Microsoft Press或Tao是否允许我发布完整列表。但这是我试图包围的部分。

// 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在分号之后本身表示它是Subscribe的返回值

看起来wrap是一个函数,它接受f和i作为参数f是一个接受一个参数的函数,在wrap的定义中,f用i作为参数调用。

在下一行换行中提供了一个Composite函数而不是两个参数。

有人可以帮我理解吗?我在FSI查了一下,然后看到了以下内容

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

在我看来,wrap有两个参数,一个是f a的函数,其中a是从用法推断出的类型并且不返回任何内容,wrap的第二个参数是类型a本身再次从用法推断并且包装返回类型a的值。

这一切的全部组合让我失望。有人能给我一个简单的方法来理解这个吗?

1 个答案:

答案 0 :(得分:2)

你对wrap的分析是正确的:它只是一种将一些副作用推入身份功能的方法(有点气味恕我直言)

我认为理解这个功能的更好方法可能是:

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

下一行

notify <- wrap notifyFunction >> notify

非常奇怪 - 它就像x = x + 1 - 它改变了notify函数(应该是一个可变变量?)来调用notifyFunction之前它会做任何事情之前做过。

没有看到剩下的代码,我只能推测: 我想notify开头只是像

那样
let mutable notify = fun _ -> ()

现在,只要您第一次使用Subscripe动作致电f: 'a -> (),代码就会将notify更改为与此相同:

let notify a = 
   f a
   ()

使用f'进行第二次通话会为您提供与此相同的内容:

let notify a = 
   f' a
   f a
   ()

依旧......

这样可行,但请:不要做这样的事情 - 它不可读,而且你根本不应该处理F#中的事情