2012-01-08 10 views
-1

RX用のC#をF#コードに変換したい。 次のC#コードです:F#RX非同期パターンを観測可能なシーケンスに変換する

Stream inputStream = Console.OpenStandardInput(); 
var read = Observable.FromAsyncPattern<byte[], int, int, int>  
    (inputStream.BeginRead, inputStream.EndRead); 
byte[] someBytes = new byte[10]; 
IObservable<int> source = read(someBytes, 0, 10); 
IDisposable subscription = source.Subscribe(
         x => Console.WriteLine("OnNext: {0}", x), 
         ex => Console.WriteLine("OnError: {0}",         ex.Message), 
         () => Console.WriteLine("OnCompleted")); 
Console.ReadKey(); 

次は、F#で私のコードです:

#light 
open System 
open System.Collections.Generic 
open System.Linq 
open System.Reactive 
open System.Reactive.Linq 
open System.Reactive.Subjects 
open System.Threading 
open System.IO 

let inputStream: Stream = Console.OpenStandardInput() 
let read = Observable.FromAsyncPattern<byte[], int, int, int>(inputStream.BeginRead, inputStream.EndRead) 
let someBytes: byte[] = Array.create 10 (byte(0)) 
let source: IObservable<int> = read(someBytes, 0, 10) 

let subscription:IDisposable = 
       source.Subscribe((fun x -> printfn "OnNext %A" x), 
           (fun ex -> printfn "OnError %A" ex.Message), 
           (fun _ -> printfn "OnComplete")) 
Console.ReadKey() |> ignore 

しかし、私は次のコンパイラエラーを得た:

Error 1 No overloads match for method 'FromAsyncPattern'. The available overloads are shown below (or in the Error List window).

Error 2 Possible overload: 'Observable.FromAsyncPattern<'TResult>(begin: Func<AsyncCallback,obj,IAsyncResult>, end: Func<IAsyncResult,'TResult>) : Func<IObservable<'TResult>>'.

Error 3 Possible overload: 'Observable.FromAsyncPattern<'T1,'TResult>(begin: Func<'T1,AsyncCallback,obj,IAsyncResult>, end: Func<IAsyncResult,'TResult>) : Func<'T1,IObservable<'TResult>>'.

これは、コンパイラでいるようですF#はオーバーロードを認識しませんでしたが、F#コンパイラをどのようにしてスマートにするかわかりません。 あなたのコードを教えてください。 ありがとう、素敵な週末があります。 John

答えて

3

問題は、FromAsyncPatternの引数が(#_->_の)F#関数ではなく、(Func<...>の)代理人であることです。したがって、(inputStream.BeginReadのような)メソッドを渡すだけではなく、明示的な関数(例えば)を渡すか、デリゲートを明示的に構築する必要があります(例えばSystem.Func<_,_,_,_,_,_>(fun a b c d e -> inputStream.BeginRead(a,b,c,d,e)))。あなたのケースでは

は、私が

let read = Observable.FromAsyncPattern(
      (fun a b c d e -> inputStream.BeginRead(a,b,c,d,e)), 
      fun r -> inputStream.EndRead r) 

が動作するはずだと思います。

+0

こんにちは、私はあなたの説明のための完全なコードを表示することができますので、私はそれをよりよく理解します。ありがとう! –

+0

@JohnJohn - 完全な例を追加しましたが、コンピュータにRXがなくても動作することを確認しています。 – kvb

+0

kvb:ありがとう、あなたのアドバイスに従ってコードを変更しました。 しかし、次のコンパイラエラーが発生しました。 エラー:2つの引数を取るメンバまたはオブジェクトコンストラクタ 'FromAsyncPattern'には、このコード位置からアクセスできません。メソッド 'FromAsyncPattern'のすべてのアクセス可能なバージョンは、2つの引数をとります。 –

関連する問題