Konwertuję kilka modułów na podstawie OCaml na F #. Mam kod przekonwertowany i działający w F #, jednak wynik ostatniej funkcji w F # nie jest taki sam jak wynik ostatniej funkcji w OCaml. Tak więc oczywiście muszę postępować zgodnie z wywołaniami funkcji, aby dowiedzieć się, która funkcja zwraca nieprawidłowy wynik.Konwertowanie OCaml na F #: Czy istnieje prosty sposób symulacji najwyższego poziomu OCaml #trace w F #
OCaml ma ładną dyrektywę najwyższego poziomu do śledzenia wejścia i wyjścia funkcji, tj. #trace.
Przeszukałem metody F # 's debug i trace, a najbliższe im jest przyuczenie kodu przy użyciu metod Trace.Write, ale dla każdej metody wymaga to kilku linii.
np.
Original
let fun001 parm001 =
parm001 * 10
Instrumented
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
Czy F # mają taką samą funkcjonalność jak OCaml #trace że brakowało podczas wyszukiwania?
Jeśli masz pewność, że odpowiedź brzmi "nie", to wszystko, czego potrzebuję. Wiem, że ludzie marszczą krótkie odpowiedzi, ale to wszystko, czego potrzebuję, jeśli odpowiedź brzmi "nie".
EDIT
Dla bardziej złożonych sposobów przechwytywania gdzie wynik będzie ewoluować znacznych modyfikacji kodu
oryginalny
let func001 parm001 parm002 =
match parm001 with
| pattern001 -> func002 parm002
| head :: tail ->
func003 head
func001 tail
| [] -> failwith "failed"
oprzyrządowanych
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
EDIT
PostSharp nie obsługuje F #. Zobacz: Using PostSharp with F# - Need documentation with working example
Wygląda interesująco. Naprawiłem błąd, x% y powinien być y% x. Będę o tym pamiętał, gdy następnym razem trafię na błąd, którego znalezienie zajmie więcej niż godzinę. –