データがある種の着信ライブ ストリームに基づいている FParsec の使用例を誰かが潜在的に投稿できることを期待しています。
いくつかの例としては、マウス ジェスチャに基づいて結果を生成したり、特定の株価ティック シーケンスに基づいてアラートまたは通知を生成したりできます。
誰かが例を投稿できれば、それは大歓迎です。
ありがとう!
データがある種の着信ライブ ストリームに基づいている FParsec の使用例を誰かが潜在的に投稿できることを期待しています。
いくつかの例としては、マウス ジェスチャに基づいて結果を生成したり、特定の株価ティック シーケンスに基づいてアラートまたは通知を生成したりできます。
誰かが例を投稿できれば、それは大歓迎です。
ありがとう!
あなたが探しているのは、Rxxのリアクティブ パーサーです。
これは 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));
もちろん、この作業の大部分を行った Dave Sexton と James Miles の功績によるものです。
背景を読むために、 Rxxのパーサー拡張機能は、この議論から出てきました:
これを 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()