首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FParsec反应式示例

FParsec反应式示例
EN

Stack Overflow用户
提问于 2012-03-29 01:53:58
回答 1查看 384关注 0票数 3

我希望有人能潜在地发布一个使用FParsec的示例,其中的数据基于某种传入的实时流。

一些示例可能是基于鼠标手势生成结果,基于特定的股票记号序列生成警报或通知。

如果有人能发布一个例子,那将是非常感谢的。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-07 09:11:24

您要寻找的是Rxx中的Reactive Parsers

这不是F#,而是一个.NET库,让您可以编写如下代码(如您的示例所示):

代码语言:javascript
复制
    var alerts = ticks.Parse(parser =>
    from next in parser
    let ups = next.Where(tick => tick.Change > 0)
    let downs = next.Where(tick => tick.Change < 0)
    let downAlert = from manyUps in ups.AtLeast(2).ToList()
               from reversalDown in downs.NonGreedy()
               where reversalDown.Change <= -11
               select new StockAlert(manyUps, reversalDown)
    let upAlert = from manyDowns in downs.AtLeast(2).ToList()
            from reversalUp in ups.NonGreedy()
            where reversalUp.Change >= 21
            select new StockAlert(manyDowns, reversalUp)
    select downAlert.Or(upAlert).Ambiguous(untilCount: 1));

当然,功劳归功于Dave Sexton和James Miles,他们完成了这项工作的大部分。

对于背景阅读,Rxx的解析器扩展来自下面的讨论:http://qa.social.msdn.microsoft.com/Forums/eu/rx/thread/0f72e5c0-1476-4969-92da-633000346d0d

下面是一个非常简单的示例,说明如何在F#中使用它:

代码语言:javascript
复制
open Rxx.Parsers.Reactive
open Rxx.Parsers.Reactive.Linq

// F# shortcuts to Rxx
let where f (a:IObservableParser<_,_>) = a.Where(fun b -> f b)
let toList (parser:IObservableParser<_,_>) = parser.ToList()
let (<&>) (a:IObservableParser<'a,'b>) (b:IObservableParser<'a,'b>) = a.And(b)
let create a = 
    { new ObservableParser<_,_>() with
        override x.Start = a(x.Next) } :> IObservableParser<_,_>
let parse (parser:IObservableParser<_,_>) (obs:IObservable<_>) = obs.Parse(parser)

// example of grammar
let grammar = 
    (fun (parser:IObservableParser<_,_>) ->
        let next = parser.Next
        let bigs = next |> where(fun i -> i > 25)
        let smalls = next |> where(fun i -> i <= 25)
        bigs <&> smalls |> toList ) 
    |> create

// the test
let random = Random()
let values = Observable.Interval(TimeSpan.FromMilliseconds(500.0)).Select( fun _ -> random.Next(1,50)).Trace().TraceSubscriptions("subbing","subbed","disposing","disposed").Publish()

let sub = values |> parse grammar |> Observable.add(printfn "BIG THEN SMALL: %A")
let test = values.Connect()
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9913065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档