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?
risposta
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)
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.
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.
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.
- 1. statico_cast per i tipi definiti dall'utente
- 2. MySQL supporta tipi di dati definiti dall'utente
- 3. tipi parametrizzati in OCaml
- 4. Tipi di dati UML definiti dall'utente in Visio 2010
- 5. Tipi ricorsivi in OCaml?
- 6. Il modo migliore per definire i tipi di dati algebrici in Python?
- 7. Come posso convertire in modo programmatico i tipi di dati SQL in tipi di dati .Net?
- 8. C# modo semplice per stampare i dati formattati
- 9. Tipi equivalenti OCaml
- 10. In che modo i linguaggi funzionali rappresentano i tipi di dati algebrici in memoria?
- 11. In che modo Ocaml decide la precedenza per gli operatori definiti dall'utente?
- 12. OCaml: imposta i moduli
- 13. Oracle: esiste un modo per ottenere i tipi di dati di colonna per una vista?
- 14. In che modo si elimina la differenza tra i tipi di dati incorporati e quelli definiti dall'utente?
- 15. Tipi di OCaml con diversi livelli di specificità
- 16. firme/tipi in programmazione funzionale (OCaml)
- 17. Esiste un modo per emulare i tipi lineari in Haskell?
- 18. Tipi definiti dall'utente in array/raccolte e per ciascun loop
- 19. Tipi di modulo OCaml e compilazione separata
- 20. C'è un modo per stampare i valori enum?
- 21. Esiste un modo per vincolare i tipi di unione?
- 22. RVO per complessi tipi definiti dall'utente in C++
- 23. In C#, c'è un modo per scrivere inizializzatori di oggetti personalizzati per nuovi tipi di dati?
- 24. C'è un modo per stampare l'azione SEL?
- 25. Gestione di più tipi di eccezione in OCaml
- 26. Tipi di varianti e sottotipi ordinati in OCaml
- 27. metodo uniforme per convertire i tipi di dati
- 28. Cos'è un modo stupidamente semplice per compilare un progetto OCaml?
- 29. C'è un modo per creare tipi nominali in TypeScript che estendono i tipi primitivi?
- 30. Come stampare i dati nella mia LinkedList
http://stackoverflow.com/questions/7442449/ocaml-polymorphic-print-and-type-losing – ygrek
http://stackoverflow.com/questions/7380755/ocaml-get-values-type-name – ygrek