OCaml的转换到F#:有一个简单的方法来模拟F#OCaml的顶层#trace(Converting

2019-09-22 06:16发布

我将基于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# -需要的文档与工作示例

Answer 1:

否(虽然我很想有在F#这样的设施)。



Answer 2:

有没有内置功能为此在F#中,但我相信你可以做到这一点使用第三方工具。

一种方法可能是使用PostSharp 。 这是面向方面编程(这是你附加一些额外的操作,以某些方法的样式)的工具。 它是作为一个后处理器,需要一个编译器组件,并增加了一些操作,以每个方法。 我不知道,如果它已经在F#中测试过,但我相信它应该工作。

使用PostSharp,你可以实现记录有关方法调用信息(就像方面 #trace OCaml中的命令),然后使用一个全局配置,以将其连接到的所有方法。 文章非侵入性跟踪和记录在其网站上实现正是这一点(在一个更加灵活和强大的方法)。



文章来源: Converting OCaml to F#: Is there a simple way to simulate OCaml top-level #trace in F#