2013-01-12 14 views
16

Używam SML wersji 4. Kiedy interaktywnie zdefiniować jakiś rodzaj drukuje tłumaczy się reprezentacja ciąg typu natychmiast po tym:Jak uzyskać informacje o typie w interaktywnym Ocaml?

# type foo = Yes | No;;   <-- This is what I entered 
type foo = Yes | No    <-- This is what interpreter bounced 

Ale po wpisaniu więcej definicji, czasami chcę zobaczyć reprezentacja tekstowa tego typu ponownie.

W języku Haskell można wpisać ": t foo".

Jak mogę to zrobić w Ocaml?

+0

To jest dobre pytanie. O ile wiem, nie ma sposobu, aby to zrobić. –

+0

Niefortunne. Najwyraźniej ciąg emitowany przez interpreter zaraz po wprowadzeniu wyrażenia jest swego rodzaju "logiem kompilacji", ale po tym informacja zostaje utracona. –

+1

Informacje z pewnością nie zostaną utracone, ponieważ są potrzebne do dalszej kompilacji. Czy zapytałeś na liście Ocaml i dlaczego nie? –

Odpowiedz

2

O ile mi wiadomo, nie jest w rzeczywistości w żaden sposób do pobierania informacji SML typ pod postaci strun

Musisz budować wzór pasujący do każdego typu

type foo = Yes | No;; 

let getType = function 
    |Yes -> "Yes" 
    |No -> "No"  
    ;; 

let a = Yes;; 
print_string (getType a);; 
7

w Utop można użyć dyrektywy #typeof:

#typeof "list";; 
type 'a list = [] | :: of 'a * 'a list 

można umieścić wartości i typy wewnątrz cudzysłowach:

let t = [`Hello, `World];; 
#typeof "t";; 
val t : ([> `Hello ] * [> `World ]) list 

P.S. Jeszcze lepszym rozwiązaniem byłoby użycie merlin.

Powiązane problemy