Debugging 将OCaml转换为F#:有没有一种简单的方法可以在F中模拟OCaml顶级#跟踪#

Debugging 将OCaml转换为F#:有没有一种简单的方法可以在F中模拟OCaml顶级#跟踪#,debugging,f#,ocaml,trace,Debugging,F#,Ocaml,Trace,我正在将几个基于OCaml的模块转换为F#。我将代码转换并在F#中运行,但是F#中的最终函数的结果与OCaml中的最终函数的结果不同。所以很明显,我必须跟踪函数调用,找出哪个函数返回了错误的结果 OCaml有一个很好的顶级指令,用于跟踪函数的输入和输出,即 我已经搜索了F#和方法,我得到的最接近的方法是使用Trace.Write方法插入代码,但每个方法都需要几行代码 e、 g 原创的 let fun001 parm001 = parm001 * 10 let func001 parm001

我正在将几个基于OCaml的模块转换为F#。我将代码转换并在F#中运行,但是F#中的最终函数的结果与OCaml中的最终函数的结果不同。所以很明显,我必须跟踪函数调用,找出哪个函数返回了错误的结果

OCaml有一个很好的顶级指令,用于跟踪函数的输入和输出,即

我已经搜索了F#和方法,我得到的最接近的方法是使用Trace.Write方法插入代码,但每个方法都需要几行代码

e、 g

原创的

let fun001 parm001 =
  parm001 * 10
let func001 parm001 parm002 =
    match parm001 with
    | pattern001 -> func002 parm002
    | head :: tail -> 
        func003 head
        func001 tail
    | [] -> failwith "failed"
仪器化

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
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
仪器化

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
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
让func001org parm001 parm002=
将parm001与
|模式001->func002 parm002
|头:尾->
func003头
func001尾部
|[]->failwith“failed”
和fun001 parm001 parm002=
//对于VS 2010,此跟踪输出将发送到输出窗口。
系统诊断跟踪写入线(“function001”);
System.Diagnostics.Trace.WriteLine(sprintf“%A”结果);
结果
编辑


PostSharp不支持F#。请参阅:

没有(尽管我希望在F#中有这样一个功能)。

在F#中没有内置的功能,但我相信您可以使用第三方工具实现这一点

一种方法可能是使用。这是一个面向方面编程的工具(这是一种将一些附加操作附加到某些方法的样式)。它被实现为一个后处理器,它接受一个已编译的程序集,并向每个方法添加一些操作。我不确定它是否已经用F#测试过,但我相信它应该能工作


使用PostSharp,您可以实现记录方法调用信息的方面(就像OCaml中的
#trace
命令),然后使用全局配置将其附加到所有方法。他们网站上的文章正好实现了这一点(并且以一种更加灵活和强大的方式)。

看起来很有趣。我已经修复了我的错误,x%y应该是y%x。下次我遇到一个需要一个多小时才能找到的bug时,我会记住这一点。