我正在读刘涛的“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的值。
这一切的全部组合让我失望。有人能给我一个简单的方法来理解这个吗?
答案 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#中的事情