2011-09-22 10 views
11

Non riesco a utilizzare print_endline perché richiede una stringa e non riesco (penso) in alcun modo per convertire i miei semplici tipi di dati definiti dall'utente in stringhe. Come posso controllare i valori delle variabili di questi tipi di dati?C'è un modo per stampare i tipi di dati definiti dall'utente in ocaml?

+0

http://stackoverflow.com/questions/7442449/ocaml-polymorphic-print-and-type-losing – ygrek

+0

http://stackoverflow.com/questions/7380755/ocaml-get-values-type-name – ygrek

risposta

7

In molti casi, non è difficile scrivere la propria routine stringa_di_di conversione. Questa è un'alternativa semplice che non richiede alcuna libreria aggiuntiva o estensioni OCaml non standard. Per i corsi che insegno che uso OCaml, questo è spesso il meccanismo più semplice per gli studenti.

(Sarebbe bello se ci fosse il supporto per una conversione generica in stringhe anche se,., Forse la roba derivante OCaml prenderà via)

+6

Questo è quello che ho fatto. Per inciso, credo di essere effettivamente nella tua classe. – tessr

+1

L'ho pensato, in base ai tempi della domanda ... :-) – stevez

8

Non c'è niente nella lingua di base che faccia questo per voi. Esiste un progetto denominato OCaml Deriving (che prende il nome da una funzione di Haskell) che può derivare automaticamente le funzioni di stampa dalle dichiarazioni di tipo. Non l'ho usato, ma suona eccellente.

http://code.google.com/p/deriving/

Una volta che hai una funzione per la stampa del tipo (derivato o no), è possibile installarlo in alto a livello di OCaml. Questo può essere utile, dato che la stampa integrata di alto livello a volte non fa esattamente quello che vuoi. Per fare ciò, utilizzare la direttiva #install-printer, descritta in Chapter 9 of the OCaml Manual.

3

Esistono funzioni di libreria di terze parti come dump in OCaml Batteries Included o OCaml Extlib, che generano genericamente qualsiasi valore in una stringa utilizzando tutte le informazioni di runtime che è possibile ottenere. Ma questo non sarà in grado di recuperare tutte le informazioni; ad esempio, i nomi dei costruttori vengono persi e diventano solo numeri interi, quindi non appariranno esattamente nel modo desiderato. Fondamentalmente dovrai scrivere le tue funzioni di conversione, o usare qualche strumento che le scriverà per te.

0

Lungo le linee di risposte precedenti, ppx_sexp è un PPX per la generazione di stampanti da definizioni di tipo. Ecco un esempio di come usarlo mentre usi jbuilder come sistema di compilazione e usa Base e Stdio come stdlib.

In primo luogo, il file jbuild che specifica come fare la build:

(jbuild_version 1) 

(executables 
((names (w)) 
    (libraries (base stdio)) 
    (preprocess (pps (ppx_jane ppx_driver.runner))) 
)) 

Ed ecco il codice.

open Base 
open Stdio 

type t = { a: int; b: float * float } 
[@@deriving sexp] 

let() = 
    let x = { a = 3; b = (4.5,5.6) } in 
    [%sexp (x : t)] |> Sexp.to_string_hum |> print_endline 

E quando lo si esegue si ottiene questa uscita:

((a 3) (b (4.5 5.6))) 

convertitori S-espressione sono presenti in tutto Base e tutti i relativi librerie (Stdio, Core_kernel, Core, asincrona, incrementale, ecc), e quindi puoi praticamente contare sulla possibilità di serializzare qualsiasi struttura dati che incontri lì, così come qualsiasi cosa tu definisca da solo.

Problemi correlati