Estoy convirtiendo varios módulos basados en OCaml a F #. Tengo el código convertido y ejecutándose en F #, sin embargo, el resultado de la función final en F # no es el mismo que el resultado de la función final en OCaml. Así que, obviamente, tengo que seguir las llamadas de función para averiguar qué función devuelve el resultado incorrecto.Convirtiendo OCaml a F #: ¿Hay una manera simple de simular OCaml top-level #trace en F #
OCaml tiene una buena directiva de nivel superior para rastrear la entrada y la salida de una función, es decir, #trace.
He buscado los métodos debug y trace de F # y lo más cerca que me sale es utilizar el código usando los métodos Trace.Write, pero se necesitan varias líneas para cada método.
p. Ej.
original
let fun001 parm001 =
parm001 * 10
instrumentado
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
Acción f # tiene la misma funcionalidad que OCaml #trace que echaba de menos cuando se busca?
Si está seguro de que la respuesta es no, eso es todo lo que necesito. Sé que la gente frunce el ceño ante las respuestas cortas, pero eso es todo lo que necesito si la respuesta es no.
EDITAR
de métodos más complejos en los que la captura el resultado se desarrollaría una amplia modificación al código
original
let func001 parm001 parm002 =
match parm001 with
| pattern001 -> func002 parm002
| head :: tail ->
func003 head
func001 tail
| [] -> failwith "failed"
instrumentada
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
EDITAR
PostSharp no es compatible con F #. Ver: Using PostSharp with F# - Need documentation with working example
Parece interesante. Ya arreglé mi error, x% y debería haber sido y% x. Lo tendré en cuenta la próxima vez que pegue un error que tarda más de una hora en encontrar. –