Debugging 将OCaml转换为F#:有没有一种简单的方法可以在F中模拟OCaml顶级#跟踪#
我正在将几个基于OCaml的模块转换为F#。我将代码转换并在F#中运行,但是F#中的最终函数的结果与OCaml中的最终函数的结果不同。所以很明显,我必须跟踪函数调用,找出哪个函数返回了错误的结果 OCaml有一个很好的顶级指令,用于跟踪函数的输入和输出,即 我已经搜索了F#和方法,我得到的最接近的方法是使用Trace.Write方法插入代码,但每个方法都需要几行代码 e、 g 原创的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
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时,我会记住这一点。