如何在F#中使用observable

时间:2015-05-10 10:54:01

标签: forms user-interface merge f# observable

我正在尝试使用observable在F#中创建一个图形应用程序。我到目前为止的代码是:

return True

我尝试使用更多或更少的Observables,当我只使用其中两个时(对于0和1),它运行正常。 Observable.merge只能使用2个Obsevables吗?有没有更好的方法来做到这一点,或者我如何使用几个observable?

凭借我平庸的搜索技巧,我在互联网上搜索了一些教程和参考资料,以简单的方式解释了可观察量,反应函数式编程,.net和WinForms的概念。如果你有任何链接到好网站,我很乐意拥有它们。 (试过msdn(可能不是它的正确部分?)和http://fsharpforfunandprofit.com/posts/concurrency-reactive

2 个答案:

答案 0 :(得分:1)

不确定为什么你的代码不起作用(我的猜测是它没有解析你的语法而不是你期望的方式 - 使用括号而不是背板来使操作的顺序更加明确),但这适用于我的代码:

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

答案 1 :(得分:1)

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

替代答案:

FieldButton *fieldButton = new FieldButton();
QMenu *allFields = new QMenu();
// ...  filling QMenu with all needed fields of QAction type like:
QAction *field = new QAction(tr("%1").arg(*h),0);
field->setCheckable(true);
allFields->addAction(field);
// ...
fieldButton->setMenu(allFields);
fieldButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
fieldButton->setIcon(QIcon(":/field.png"));
fieldButton->setText("My text");
fieldButton->setCheckable(true);
toolbar->addWidget(fieldButton);