【问题标题】:Converting OCaml to F#: Is there a simple way to simulate OCaml top-level #trace in F#将 OCaml 转换为 F#:有没有一种简单的方法可以在 F# 中模拟 OCaml 顶级 #trace
【发布时间】:2012-09-07 19:12:27
【问题描述】:

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

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

我搜索了 F# 的 debugtrace 方法,我得到的最接近的是使用 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#。见:Using PostSharp with F# - Need documentation with working example

【问题讨论】:

    标签: debugging f# ocaml trace


    【解决方案1】:

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

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

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

    【讨论】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 2012-05-12
      • 2012-09-08
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多