Tôi đang cố gắng để hiểu một điều cụ thể về module ocaml và biên soạn của họ:Redundancy trong khai báo kiểu OCaml (ml/MLI)
là tôi buộc phải redeclare loại đã tuyên bố trong một .mli
bên trong .ml
triển khai cụ thể?
Chỉ cần đưa ra một ví dụ:
(* foo.mli *)
type foobar = Bool of bool | Float of float | Int of int
(* foo.ml *)
type baz = foobar option
này, theo cách thông thường của tôi về suy nghĩ về giao diện/triển khai, nên ok nhưng nó nói
Error: Unbound type constructor foobar
trong khi cố gắng để biên dịch với
ocamlc -c foo.mli
ocamlc -c foo.ml
Tất nhiên lỗi sẽ biến mất nếu tôi khai báo foobar
bên trong foo.ml
quá nhưng có vẻ như một cách phức tạp vì tôi phải giữ mọi thứ được đồng bộ hóa trên mọi thay đổi.
Có cách nào để tránh sự thừa này hoặc tôi buộc phải redeclare các loại mỗi lần?
Cảm ơn trước
Tôi không nghĩ rằng nên có bất kỳ hạn chế nào trong việc cho phép tệp '.ml' suy ra các loại được giải mã trong' .mli'. Từ những gì tôi hiểu thực hiện __forces redundancy__ thực tế nhưng cũng __the hai chữ ký phải bằng nhau vì vậy điều này có hiệu quả tăng gấp đôi cùng một tờ khai. Đó là lý do tại sao tôi nghĩ rằng nó nên được nhận thức của những tuyên bố mà không cần phải sao chép và dán chúng. Các thuật toán suy luận loại sẽ không bị vấn đề theo tôi. – Jack
Nó không hoàn toàn buộc dự phòng cũng không yêu cầu chữ ký giống hệt nhau, chỉ cần khai báo trong tệp ml phải bằng hoặc cụ thể hơn khai báo mli. Điểm mli là để xác định những gì có thể nhìn thấy trong giao diện, vì vậy bạn có thể chọn không để lộ loại (trong trường hợp nó không có trong tập tin mli) hoặc bạn có thể chọn để lộ rằng có một loại, nhưng không phải như thế nào nó được sử dụng (trong trường hợp này các khai báo kiểu khác nhau). Tất nhiên trong tình huống của bạn nó sẽ có ý nghĩa cho trình biên dịch để chỉ giả định loại kể từ khi nó được xác định đầy đủ trong mli. –
@Niki không có dự phòng buộc trong các khai báo * value * (tùy chọn trong .ml anyway), và trong thực tế đó là nơi "ít nhất là cụ thể như" đi kèm. Nhưng trong 99% các trường hợp * loại khai báo * được khai báo trong một giao diện giống hệt với định nghĩa của loại trong việc triển khai. Điều này là dư thừa, và gây khó chịu, nhưng với tư cách là một nhà thiết kế ngôn ngữ, tôi đã suy nghĩ rất kỹ về vấn đề này và tôi đã không đưa ra một đề nghị mà tôi cho rằng cả hai đều là nguyên tắc và tốt hơn đáng kể so với OCaml. –