我正在将几个基于 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#。请参阅:将 PostSharp 与 F# 一起使用 - 需要带有工作示例的文档