2015-05-10 38 views
0

我正尝试在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

回答

0

不知道为什么你的代码不会工作(我的猜测是它不会解析你的语法,你相当期待 - 使用括号比backpipes使OPS更明确的顺序),但这部作品在我的代码:

let btns = [GUI.buttonNum0; GUI.buttonNum1; GUI.buttonNum2; GUI.buttonNum3] 
let observables = btns |> List.mapi(fun i btn -> Observable.map (fun _ -> i) btn.Click) 
Observable.Merge observables 
+0

您正在使用'从RX.NET,其'Merge'方法有多个重载,其中一个取观测序列,这是你用什么Observable'静态类。但OP使用FSharp.Control中的'Observable'模块,它的'merge'函数需要两个可观察对象,而不是一个序列。为此,我不明白OP的代码是如何编译的。 –

+0

RX.net会是更好的选择吗?我想了解如何通过Windows窗体使用F#GUI,所以我决定制作一个简单的计算器。你知道任何能够帮助我获得所需知识的网站吗? –

+0

找到https://msdn.microsoft.com/en-us/data/gg577609.aspx,所以会尝试学习并使用它。感谢您的回答,希望它能够像我一样使用相同的Observable.Merge。 –

0

一些发展我的技能经过我想出了另一种解决这个问题。当使用FSharp.Control时,你可以将两个observables合并为一个,然后重复这个过程。因此,我提出的解决方案就是使用它。通过使用递归,你可以循环遍历observables,我决定把它放在一个列表中,首先把前两个放在一起,然后和下一个放在一起,等等。

备选答案:

let obsList = [ for x in 0..80 -> (Observable.map (fun _-> x) ((Array.get(gameButtons)(x)).Click)) ] 

let rec obsMerger obsList = 
     match obsList with 
     | x1::[] -> x1 
     | x1::xs -> Observable.merge x1 (obsMerger xs) 
     | [] -> failwith "No Observables" 
相关问题