1

目前我使用它,它工作正常:

let mutable notify = fun x -> x
let wrap f i = f(i); i

let a x = printf "%A" x
notify <- notify >> (wrap a)

notify "ss"

还有其他更好的方法吗?

为什么这不起作用?

let mutable notify = fun x -> x
let wrap f i = f(i); i

let a x = printf "%A" x  
let d x =
    (notify >> (wrap a)) x
notify <- d

notify "ss"

我不确定为什么第一个示例不会触发无限循环,但第二个示例会触发。

似乎可变函数变量(无点函数)的行为与我预期的不同。我可以从哪里了解有关此主题的更多信息?

4

3 回答 3

3

你不想用MulticastDelegate吗?

type D<'T> = delegate of 'T -> 'T
let mutable notify = D<string>(fun x -> x)
let wrap f i = f(i); i
let a x = printfn "%A" x
notify <- Delegate.Combine(notify, D<string>(wrap a)) :?> _
notify.Invoke "ss"

您的第二个示例失败,因为dcallsnotify无限递归。

于 2013-07-17T19:40:36.607 回答
1

这是一个简单的选择。如果您想表示要调用的函数列表,那么为什么不保留一个(可变)函数列表呢?

let handlers = ResizeArray()
let notify x = 
    for f in handlers do
        f x

handlers.Add(fun x -> printf "%A" x)

notify "ss"
于 2013-07-18T01:24:08.907 回答
1

我相信在函数式编程范式中组合多个处理程序的方法是让每个处理程序尾调用其第一个参数,并传递其余参数。然后用另一个处理程序将其咖喱,形成处理程序的链或单链表。

于 2013-07-17T19:18:57.620 回答