我正尝试在F#中使用observables创建一个图形应用程序。我到目前为止的代码是:如何在F中使用observables#
open System.Windows.Forms
let form = new Form(Text="Test", TopMost=true)
let buttonNum0 = new Button(Text="1");
let buttonNum1 = new Button(Text="2", Top=20);
let buttonNum2 = new Button(Text="3", Top=40);
let buttonNum3 = new Button(Text="4", Top=60);
form.Controls.AddRange [| buttonNum0 ; buttonNum1; buttonNum2; buttonNum3 ; |]
let rec loop observable list = async{
printList list
(Async.Await)
let! somethingObservable = Async.AwaitObservable(observable)
match somethingObservable with
| 0 -> return! loop observable ("0"::list)
| 1 -> return! loop observable ("1"::list)
| 2 -> return! loop observable ("2"::list)
| 3 -> return! loop observable ("3"::list)
| _ -> return! loop observable ("?"::list)
}
module GUIInterface =
//Here we define what we will be observing (clicks)
let observables =
Observable.merge
<| Observable.map (fun _-> 0) GUI.buttonNum0.Click
<| Observable.map (fun _-> 1) GUI.buttonNum1.Click
<| Observable.map (fun _-> 2) GUI.buttonNum2.Click
<| Observable.map (fun _-> 3) GUI.buttonNum3.Click
Async.StartImmediate(loop GUIInterface.observables []) ; System.Windows.Forms.Application.Run(GUI.form)
我一直在使用或多或少的观测量尝试,当我只使用它们中的两个(examle 0和1),那么它工作正常。 Observable.merge只能使用2个Obsevables吗?有没有更好的方法来做到这一点,或者我该如何使用几个可观察的?
凭借我平庸的搜索技巧,我在互联网上搜索了一些教程和参考资料,以简单的方式解释了观察者,反应函数式编程,.net和WinForms的概念。如果你有任何链接到好网站,我很乐意拥有它们。 (试过msdn(也许不是它的正确部分?)和http://fsharpforfunandprofit.com/posts/concurrency-reactive)
您正在使用'从RX.NET,其'Merge'方法有多个重载,其中一个取观测序列,这是你用什么Observable'静态类。但OP使用FSharp.Control中的'Observable'模块,它的'merge'函数需要两个可观察对象,而不是一个序列。为此,我不明白OP的代码是如何编译的。 –
RX.net会是更好的选择吗?我想了解如何通过Windows窗体使用F#GUI,所以我决定制作一个简单的计算器。你知道任何能够帮助我获得所需知识的网站吗? –
找到https://msdn.microsoft.com/en-us/data/gg577609.aspx,所以会尝试学习并使用它。感谢您的回答,希望它能够像我一样使用相同的Observable.Merge。 –