2013-11-20 6 views
9

OCaml을 처음 사용하고 일부 OCaml 코드를 디버깅하려고합니다. OCaml에서 대부분의 객체를 출력으로 인쇄 할 수있는 Java의 toString() 함수와 동일한 기능이 있습니까?OCaml에서 toString()이 (가)

+0

그것은 OCaml의의 아킬레스 피트이었다. 그 대답은 아마도 * Core * 또는 * Batteries *를 사용하는지에 달려 있습니다. – lukstafi

답변

9

Pervasives 모듈에는 string_of_int, string_of_float, string_of_bool과 같은 기능이 있습니다 (Pervasive이기 때문에 Pervasives 모듈을 열 필요가 없습니다).

또는 Printf를 사용하여 이러한 종류의 출력을 수행 할 수 있습니다. 예를 들면 :

let str = "bar" in 
let num = 1 in 
let flt = 3.14159 in 
Printf.printf "The string is: %s, num is: %d, float is: %f" str num flt 

거기 PRINTF 모듈에서의 sprintf 함수는, 그래서 당신은 그냥 표준 출력 대신 인쇄의 문자열을 생성하기를 원한다면 당신이 마지막 라인을 대체 할 수 :

let output = Printf.sprintf "The string is: %s, num is: %d, float is: %f" str num flt 

들어 더 복잡한 데이터 유형을 정의하려면 Deriving 확장자를 사용하여 유형에 맞는 예쁜 프린터 함수를 정의 할 필요가 없습니다.

+2

Sexplib 라이브러리도 유용 할 수 있습니다. – Kakadu

4

코어 및 관련 Sexplib 구문 확장을 사용하는 경우이 문제에 대한 해결책이 있습니다. 본질적으로 sexplib은 OCaml 형식에서 s 식과 변환기를 자동으로 생성하여 편리한 serialization 형식을 제공합니다.

다음은 Core 및 Utop을 사용한 예입니다. 당신이 자신 코어를 사용하도록 설정 얻기를 위해 다음과 같은 지침을 따르 확인 : http://realworldocaml.org/install

utop[12]> type foo = { x: int 
        ; y: string 
        ; z: (int * int) list 
        } 
      with sexp;; 

type foo = { x : int; y : string; z : (int * int) list; } 
val foo_of_sexp : Sexp.t -> foo = <fun> 
val sexp_of_foo : foo -> Sexp.t = <fun> 
utop[13]> let thing = { x = 3; y = "hello"; z = [1,1; 2,3; 4,2] } ;; 
val thing : foo = {x = 3; y = "hello"; z = [(1, 1); (2, 3); (4, 2)]} 
utop[14]> sexp_of_foo thing;; 
- : Sexp.t = ((x 3) (y hello) (z ((1 1) (2 3) (4 2)))) 
utop[15]> sexp_of_foo thing |> Sexp.to_string_hum;; 
- : string = "((x 3) (y hello) (z ((1 1) (2 3) (4 2))))" 

당신은 또한 다음과 같은 인라인 인용 구문을 사용하여 이름이 지정되지 않은 유형의 sexp 컨버터를 생성 할 수 있습니다.

utop[18]> (<:sexp_of<int * float list>> (3,[4.;5.;6.]));; 
- : Sexp.t = (3 (4 5 6)) 

더 많은 세부 사항은 여기에 있습니다 : https://realworldocaml.org/v1/en/html/data-serialization-with-s-expressions.html

관련 문제