2012-03-28 12 views
3

FParsecを使用した例が投稿される可能性があります。データが何らかの着信ライブストリームに基づいている場合があります。FParsec反応例

いくつかの例では、マウスジェスチャーに基づいて結果を生成し、特定のストックティックのシーケンスに基づいてアラートまたは通知を生成する場合があります。

誰かが例を投稿することができれば、非常に感謝します。

ありがとうございます!

+3

このスレッドはために役立つことができあなたはhttp://stackoverflow.com/questions/8891019/chunked-parsing-with-fparsec – pad

答えて

3

あなたが探しているのは、RxxのうちReactive Parsersです。

は、これは、(あなたの株式の例から次)として、あなたがコードを書いてみましょうF#のではなく、.NETライブラリではありません。もちろん

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)); 

クレジットがしたデイブ・セクストンとジェームズ・マイルに行くをこの仕事の大半背景読書のために

、RXXへのパーサーの拡張機能は、この議論から出てきた:http://qa.social.msdn.microsoft.com/Forums/eu/rx/thread/0f72e5c0-1476-4969-92da-633000346d0d

はここで、これはF#で使用することができる方法の非常に単純な例です:

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()