5

OCamlに基づいたいくつかのモジュールをF#に変換しています。コードを変換してF#で実行していますが、F#の最終関数の結果は、OCamlの最終関数の結果と同じではありません。したがって、明らかに、関数呼び出しに従って、どの関数が間違った結果を返しているかを把握する必要があります。

OCamlには、関数の入力と出力をトレースするための優れたトップレベルのディレクティブ、つまり#traceがあります。

F#のデバッグメソッドとトレースメソッドを検索しました。最も近いのは、Trace.Writeメソッドを使用してコードをインストルメント化することですが、メソッドごとに数行かかります。

例えば

オリジナル

let fun001 parm001 =
  parm001 * 10

計装

let fun001 parm001 =
  // For VS 2010, this trace output will be sent to Output window.
  System.Diagnostics.Trace.WriteLine("function001 <--");      
  System.Diagnostics.Trace.WriteLine(sprintf "%A" parm001);      
  let result = parm001 * 10
  System.Diagnostics.Trace.WriteLine("function001 -->");
  System.Diagnostics.Trace.WriteLine(sprintf "%A" result);
  result

F#には、検索時に見逃したOCaml #traceと同じ機能がありますか?

答えがノーだと確信しているなら、それが私に必要なすべてです。私は人々が短い答えに眉をひそめることを知っています、しかし答えがノーであるならばそれは私が必要とするすべてです。

編集

結果をキャプチャするとコードが大幅に変更される、より複雑なメソッドの場合

オリジナル

let func001 parm001 parm002 =
    match parm001 with
    | pattern001 -> func002 parm002
    | head :: tail -> 
        func003 head
        func001 tail
    | [] -> failwith "failed"

計装

let func001org parm001 parm002 =
    match parm001 with
    | pattern001 -> func002 parm002
    | head :: tail -> 
        func003 head
        func001 tail
    | [] -> failwith "failed"
and fun001 parm001 parm002 =
  // For VS 2010, this trace output will be sent to Output window.
  System.Diagnostics.Trace.WriteLine("function001 <--");      
  System.Diagnostics.Trace.WriteLine(sprintf "%A, %A" parm001 parm002 );      
  let result = func001org parm001 parm002 
  System.Diagnostics.Trace.WriteLine("function001 -->");
  System.Diagnostics.Trace.WriteLine(sprintf "%A" result);
  result

編集

PostSharpはF#をサポートしていません。参照:F#でのPostSharpの使用-実用的な例を含むドキュメントが必要

4

2 に答える 2

5

F#にはこれに組み込まれた機能はありませんが、サードパーティのツールを使用して実現できると思います。

1つのアプローチは、PostSharpを使用することです。これはアスペクト指向プログラミング用のツールです(特定のメソッドに追加の操作を追加するスタイルです)。これは、コンパイルされたアセンブリを受け取り、各メソッドにいくつかの操作を追加するポストプロセッサとして実装されます。F#でテストされているかどうかはわかりませんが、動作するはずです。

PostSharpを使用すると、メソッド呼び出しに関する情報をログに記録するアスペクト#traceを実装し( OCamlのコマンドと同様)、グローバル構成を使用してすべてのメソッドにアタッチできます。彼らのウェブサイトの記事Non-InvasiveTracing&Loggingは、まさにこれを(そしてはるかに柔軟で強力な方法で)実装しています。

于 2012-09-07T23:17:40.950 に答える
4

いいえ(F#にそのような機能があればいいのですが)。

于 2012-09-07T19:19:27.430 に答える