我试图阻止一个事件两次订阅一个事件:
let ex = new Event<int>()
let lst = new ResizeArray<obj>()
let subscribe f =
if (lst.Contains f) then // <- doesn't work, can't compare functions
failwith ("subscribed twice!!")
else
lst.Add(f)
let obs = ex.Publish :> System.IObservable<_>
obs |> Observable.subscribe f
不幸的是,它不起作用。例如
let foo x = printfn "%d" x
subscribe foo
subscribe foo
ex.Trigger 42 // Produces 42 42
看起来我们无法比较 F# 中的函数。
if (foo = foo) then () // won't compile
(foo :>obj) = (foo :> obj) // = false
有没有办法比较函数,或者是否有另一种方法可以停止对事件/IObservables 的多个订阅?