将OCaml转换为F#:是否有一种简单的方法来模拟F#中的OCaml顶级#trace

Guy*_*der 5 debugging f# trace ocaml

我正在将基于OCaml的几个模块转换为F#.我将代码转换并在F#中运行,但是F#中的最终函数的结果与OCaml中的最终函数的结果不同.所以显然我必须按照函数调用来确定哪个函数返回错误的结果.

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

我已经搜索了F#的调试跟踪方法,最接近的是使用Trace.Write方法检测代码,但每个方法需要几行.

例如

原版的

let fun001 parm001 =
  parm001 * 10
Run Code Online (Sandbox Code Playgroud)

仪表

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
Run Code Online (Sandbox Code Playgroud)

F#是否具有与我在搜索时遗漏的OCaml #trace相同的功能?

如果你确定答案是肯定的,那就是我所需要的.我知道人们对简短的答案皱眉,但如果答案是否定的,那就是我所需要的.

编辑

对于更复杂的方法,捕获结果会对代码进行大量修改

原版的

let func001 parm001 parm002 =
    match parm001 with
    | pattern001 -> func002 parm002
    | head :: tail -> 
        func003 head
        func001 tail
    | [] -> failwith "failed"
Run Code Online (Sandbox Code Playgroud)

仪表

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
Run Code Online (Sandbox Code Playgroud)

编辑

PostSharp不支持F#.请参阅:将PostSharp与F#一起使用 - 需要使用工作示例的文档

Tom*_*cek 5

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

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

使用PostSharp,您可以实现记录有关方法调用的信息的方面(就像#traceOCaml中的命令一样),然后使用全局配置将其附加到所有方法.他们的网站上的非侵入性跟踪和记录文章正是这样实现的(并且以更加灵活和强大的方式).


pad*_*pad 4

不(尽管我很想在 F# 中拥有这样的功能)。