F# 需要帮助了解这里正在做什么吗
我正在读刘涛写的《为C开发者的F》。第139页有一个观察者模式的示例。我不确定Microsoft press或Tao是否允许我发布完整的列表。但这是我想绕着头的部分F# 需要帮助了解这里正在做什么吗,f#,F#,我正在读刘涛写的《为C开发者的F》。第139页有一个观察者模式的示例。我不确定Microsoft press或Tao是否允许我发布完整的列表。但这是我想绕着头的部分 // subscribe to a notification function member this.Subscribe notifyFunction = let wrap f i = f i ; i notify <- wrap notifyFunction >> notify 在我看来,w
// subscribe to a notification function
member this.Subscribe notifyFunction =
let wrap f i = f i ; i
notify <- wrap notifyFunction >> notify
在我看来,wrap
有两个参数,一个是f
a的函数,其中a是从用法推断出的类型,不返回任何值,wrap
的第二个参数是类型a本身,它也是从用法推断出的,wrap返回类型a的值
这一切的结合让我很反感。有人能给我一个简单的方法来理解这一点吗?你对
wrap
的分析是正确的:这只是一种将一些副作用推入身份功能的方法(有点异味)
我认为更好地理解这一功能的方法是:
let wrap (action : 'a -> unit) : 'a -> 'a =
fun a -> action a
a
下一行
notify <- wrap notifyFunction >> notify
现在,每当您第一次使用操作f:'a->()
调用subscribe
,代码将更改为notify
,等同于此:
let notify a =
f a
()
let notify a =
f' a
f a
()
使用f'
的第二次调用将为您提供与此等效的内容:
let notify a =
f a
()
let notify a =
f' a
f a
()
等等
这会有用的,但请不要这样做——这是不可读的,而且根本不是你应该用F#处理事情的方式。你有很强的辨别能力。你完全正确,不需要太多技能。。。都在类型中;)您对答案是否满意,或者您是否有不明白的地方?Wrap可以用于在每次触发通知或类似事件时记录日志。当然,在某些情况下不应该这样做,但我不认为这本身就不好。是的,但不要以一种你看不到它在做什么的方式来编写它。在这里给出的示例中,它是“神奇”函数,但缩进被错误的命名和缺少类型签名所隐藏(始终为顶级和重要功能提供签名)-如果warp在此处直接使用notifiyFunction并在其前面添加名称
或其他内容,则会更清楚-我将添加我的答案以使其更清楚