2012-09-07 53 views
5

我將基於OCaml的幾個模塊轉換爲F#。我將代碼轉換並在F#中運行,但F#中的最終函數的結果與OCaml中的最終函數的結果不同。所以顯然我必須按照函數調用來找出哪個函數返回了錯誤的結果。將OCaml轉換爲F#:是否有一種簡單的方法來模擬Fam中的OCaml頂層#trace

OCaml有一個很好的頂級指令用於跟蹤函數的輸入和輸出,即#trace

我已經搜索了F#的debugtrace方法,而且我得到的最接近的方法是使用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我搜索時錯過了嗎?

如果您確定答案是否定的,那就是我所需要的。我知道人們對簡答題不滿,但如果答案是否定的,那就是我所需要的。

EDIT

對於更復雜的方法,其中捕獲所述結果將演變大量修改的代碼

原始

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 

EDIT

PostSharp不支持F#。見:Using PostSharp with F# - Need documentation with working example

回答

3

沒有(雖然我很想在F#有這樣的設施)。

5

在F#中沒有內置功能,但我相信您可以使用第三方工具來實現此功能。

一種方法可能是使用PostSharp。這是面向方面編程的一種工具(這是一種將某些附加操作附加到某些方法的樣式)。它作爲一個後處理器來實現,它接受一個編譯後的程序集併爲每個方法添加一些操作。我不確定它是否已經通過F#測試過,但我相信它應該可以工作。

使用PostSharp,可以實現方面該記錄有關的方法調用信息(就像OCaml中的#trace命令),然後使用一個全局配置,以將其連接到的所有方法。文章Non-Invasive Tracing & Logging在他們的網站上實現了這一點(並且以更靈活和更強大的方式)。

+0

看起來很有意思。我已經修復了我的bug,x%y應該是y%x。下一次我遇到需要一個多小時才能找到的錯誤時,我會記住它。 –

相關問題