OCaml-afschriften afdrukken

Is het mogelijk om afdrukinstructies voor debuggen/testen in codeblokken te plaatsen? In Java kunt u bijvoorbeeld System.out.println("")gebruiken in het midden van methoden om variabelen of andere dingen te controleren, maar zou in OCaml een commando als print_stringwerken? Zou het geen waarde van het type eenheid retourneren, waardoor een fout wordt veroorzaakt, in plaats van u toe te staan deze af te drukken?


Antwoord 1, autoriteit 100%

Het komt goed als je de afdruk insluit in een uitdrukkingsvolgorde.

UPDATE

Hier is een concreet voorbeeld, omdat het antwoord hierboven nogal kort was en, nou ja, antwoorden met alleen links zijn geen goede antwoorden. Het is de klassieke staart-recursieve formulering van faculteit (ja, saai, maar bekend):

# let fac n =
  let rec f i n acc =
    if i >= n
    then acc
    else (Printf.printf "%8d%8d%8d\n" i n acc; f (i+1) n ((i+1)*acc))
  in
    f 0 n 1;;
val fac : int -> int = <fun>
# fac 5;;
       0       5       1
       1       5       1
       2       5       2
       3       5       6
       4       5      24
- : int = 120

Hier zie je de bijwerkingen van de print, maar het resultaat bleek toch 120 te zijn zoals verwacht.


Antwoord 2, autoriteit 55%

Omdat OCaml geen purefunctionele taal is, zijn er veel manieren om dit te doen. Dit is de manier waarop ik dit soort code schrijf, alleen voor een concreet voorbeeld.

let rec mylength list =
(* DEBUG *)
let () = Printf.printf "mylength here, null list: %b\n%!" (list = [])
in
(* DEBUG *)
    match list with
    | [] -> 0
    | _ :: rest -> 1 + mylength rest

Nadat het werkt, kunt u het spul in de (* debug *) opmerkingen verwijderen.

Let op het gebruik van%! om de buffer te spoelen. Als u veel debuggen met printf(zoals ik doen), is het echt nuttig om hierover te leren.


Antwoord 3, Autoriteit 18%

Hier is een eenvoudig voorbeeld dat laat zien dat expressiesequenties zoals vermeld in ray toal’s antwoord don ‘ t noodzakelijk haakjes om hen heen:

let get_a_string = 
  let a_string = "a string" in
  (* The semicolon causes the return value of the statement to be discarded *)
  Printf.printf "Debug: %s\n" a_string; 
  a_string
let () = Printf.printf "Result: %s\n" get_a_string

Nog een manier om de retourwaarde van een functie te verwijderen, gebruikt ignore:

ignore (Printf.printf "Debug info");

Other episodes