2012-01-31 10 views
6

私は、関数f#(代理?)をパラメータとするf#からc#関数を呼び出そうとしており、この引数をf#関数にする必要があります。例:#f#関数でのC#代理人の使用

public static void function_1(double x, ref double y) 
{ 
    y = Math.Exp(x); 
} 

main() 
{ 
    state s; 
    call_func(s, function_1) 
} 

C

サンプルだから、call_funcは、私が試した、F#ではタイプvoid fn(double, ref double)

のパラメータがあります。

let function_1 (x:double) (y:double byref) = 
    let y = 6.0 
    () 

let test = 
    let s = new state 
    let ret = call_func(s, function_1) 

しかし、私はF#のfunction_1が持っているエラーが発生します代理人void fn(double, ref double)の種類である場合はdouble -> double byref -> unitと入力します。

タイプなどをキャストできますか?またはエラーがありますか?

答えて

9

あなたはF#で関数からデリゲートを作成する場合は、引数としてnew演算子を使用し、それに機能を与えることができます:

let function_1 (x:double) (y:double) = 
    () 

Program.call_func(s, new Action<double, double>(function_1)) 

しかし、some reasonため、同じを使用しようとした場合refが含まれているデリゲートとアプローチ、あなたはこのエラーを取得する:

This function value is being used to construct a delegate type whose signature includes a byref argument. You must use an explicit lambda expression taking 2 arguments.

エラーメッセージによって与えられたアドバイスに従うのであれば、あなたは次のように記述することができます。

let function_1 (x:double) (y:double byref) = 
    y <- 6.0 

Program.call_func(s, new fn(fun x -> fun y -> function_1 x &y)) 

これはコンパイルされ、期待どおりに動作します。

パラメータyを変更するには、<-演算子を使用する必要があります。 let y = 6.0を使用すると、パラメータをシャドーする完全に異なる変数が宣言されます。

+0

あなたの助けてくれてありがとう、しかし、私はエラーが発生しました "タイプ 'fn'は新しい引数のために定義されていません。 – b1g3ar5

+0

'fn'は、関数が期待するデリゲートの型です。おそらく、それが入っているネームスペースに対して 'open'が不足しているかもしれません。あるいは、あなたのコードで別のものと呼ばれるかもしれません。または、あるクラスにネストすることもできます(そのような場合は、デリゲートを含む型の名前とともに名前を指定する必要があります)。 – svick

+0

OK、私は理解します - 今コンパイルします。私が新しいものを残しておけばそれもコンパイルされますが、それはうまくいくのでしょうか? – b1g3ar5

関連する問題