Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 需要帮助了解这里正在做什么吗_F# - Fatal编程技术网

F# 需要帮助了解这里正在做什么吗

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

我正在读刘涛写的《为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
在我看来,
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并在其前面添加名称
或其他内容,则会更清楚-我将添加我的答案以使其更清楚