2010-05-12 15 views
5

W a.ml jest zdefiniowany typ rekordu t, który jest również zdefiniowany jako przezroczysty w a.mli, tzn. W interfejsie d tak, że definicja typu jest dostępny dla wszystkich pozostałych plików.jak uzyskać dostęp do typu zdefiniowanego w jednym pliku .ml w innym pliku .ml

a.ml ma również funkcję, func, która zwraca listę t.

Teraz w innym pliku, b.ml I m wywoływania func, teraz oczywiście ocaml kompilator wud nt móc wywnioskować typ D obiektów przechowywanych w wykazie D dla kompilatora jej tylko listę. tak w b.ml, HAV coś podobnego dis,

let tlist = A.func in 
let vart = List.hd tlist in 
printf "%s\n" vart.name  (*name is a field in record t*) 

Teraz tu pojawia się błąd kompilatora mówię „Bez ograniczeń wytwórni dziedzinie imię”, które ma sens jak kompilator nie można wywnioskować typ D z vårt.

moje pierwsze pytanie: w jaki sposób mogę jawnie podać typ VART jako t tutaj? Próbowałem robić "let vart: A.t =", ale otrzymałem błąd o wartości .

Próbowałem także utworzyć inną funkcję, aby pobrać pierwszy element z listy d i wspomnieć o typie powrotu jako A.t, ale potem otrzymałem "Niezwiązaną wartość A.t". Zrobiłem to:

let firstt = function 
    [] -> 0 
    | x :: _ -> A.t x ;; 

Problemem jest kompilator jest w stanie rozpoznać A.t (typ A) w b.ml ale jest w stanie rozpoznać funkcję A.func. Jeśli usuniemy plik A.t z pliku b.ml , nie zgłaszam żadnych błędów kompilatora.

Odpowiedz

7

Kompilator jest stanie rozpoznać A.t do wyznaczenia typu t z pliku a.ml.

Z drugiej strony, t x gdzie t jest typem, a x zmienna nie jest poprawnym wyrażeniem. To jest źródłem twojego problemu. Kompilator szuka nazwy t w zmiennych wyeksportowanych przez a.ml. Ponieważ nie może znaleźć tej nazwy dla zmiennej, zgłasza błąd.

Teraz za to, co staraliśmy się zrobić:

  • typu adnotacje nie są aluzje do kompilatora w SML. Posiada algorytm, który pozwala wywnioskować typ (najbardziej ogólny, z pewnymi wyjątkami, do których nie wchodzę), a następnie sprawdza, czy twoja adnotacja jest przynajmniej szczegółowością najbardziej ogólnego typu. Adnotacja typu, którą podasz, nigdy (ponownie, z pewnymi wyjątkami, które Cię nie dotyczą) sprawi, że zmieni ona zdanie.

  • Aby dostępu w pliku b.ml dziedzinie f rekordu r typu A.t, typ r.A.f.

0
let tlist = A.func in 
let vart = List.hd tlist in 
printf "%s\n" vart.name  (*name is a field in record t*) 

Tutaj tlist jest funkcją, przypuszczam, że jest typu 'a -> A.t list, ale starasz się List.hd na tej funkcji, kiedy piszesz let vart = List.hd tlist.

Powinieneś podać argument funkcji, aby uzyskać listę A.t na przykład let tlist = A.func (your_argument-s-_here), domyślam się, że to jest źródło twojego błędu, kompilator jest w stanie wywnioskować typy między modułami.

Powiązane problemy