Tôi đang thử nghiệm ngôn ngữ mô-đun của OCaml (3.12.1), xác định các functors và chữ ký cho các mô-đun và cứ như vậy, chủ yếu là theo các ví dụ từ Chapter 2 of the OCaml manual và tôi đã tình cờ gặp , trên một tình huống mà dường như mô hình tinh thần của tôi về cách functors và mô-đun chữ ký làm việc là thiếu sót. Tôi đã cố gắng thu hẹp tình huống mà tôi gặp phải với số lượng mã ngắn nhất có thể, do đó, không hỏi những gì tôi đang cố gắng hoàn thành, đây là một ví dụ hoàn toàn giả vờ để chứng minh tính năng OCaml được đề cập.OCaml functors :: hành vi truy cập trực quan
Vì vậy, chúng tôi có một hàm sĩ chỉ đơn giản cung cấp chức năng nhận dạng 'f' và được tham số bởi một mô-đun cung cấp loại thông số đầu vào của hàm đó. Ví dụ hoàn toàn giả tạo như tôi đã nói.
module type SOMETYPE = sig type t end ;;
module Identity = functor (Type: SOMETYPE) -> struct let f (x: Type.t) = x end ;;
Given ở trên, chúng tôi tiến hành để xác định một mô-đun cung cấp các loại int:
module IntType = struct type t = int end ;;
.. và sau đó chúng tôi sử dụng các functor để tạo ra một mô-đun cho hàm int sắc:
module IdentityInt = Identity(IntType) ;;
chắc chắn đủ các module được tạo ra và f chức năng cư xử của mình như mong đợi:
#IdentityInt.f(3) + 10 ;;
- : int = 13
Mô hình tinh thần của các functors là các chức năng lấy mô-đun làm đầu vào và các mô-đun trả về dường như đang phục vụ chúng ta cho đến nay. Các Identity
functor mong đợi như tham số đầu vào một mô-đun chữ ký (loại mô-đun) SOMETYPE, và thực sự mô-đun chúng tôi cung cấp (IntType
) có chữ ký chính xác và do đó mô-đun đầu ra hợp lệ được sản xuất (IdentityInt
) có chức năng hoạt động như mong đợi.
Bây giờ đến phần không trực quan. Điều gì sẽ xảy ra nếu chúng ta muốn làm rõ rằng module được cung cấp IntType
thực sự là kiểu mô-đun SOMETYPE. Như trong:
module IntType : SOMETYPE = struct type t = int end ;;
và sau đó tạo ra mô-đun đầu ra của functor theo cùng một cách như trước:
module IdentityInt = Identity(IntType) ;;
... chúng ta hãy cố gắng sử dụng f
chức năng của các module mới được tạo ra:
IdentityInt.f 0 ;;
Whereupon REPL than phiền với:
"Error: This expression [the value 0] has type int but an expression was expected of type IntType.t."
Làm cách nào để cung cấp thông tin loại thừa nhưng đúng loại vi phạm mã? Ngay cả trong trường hợp Một mô-đun functor Danh tính phải xử lý mô-đun IntType
là loại SOMETYPE
. Vậy làm cách nào để khai báo rõ ràng IntType
là loại SOMETYPE
mang lại kết quả khác?
Có mục đích là 'module IntType' thứ hai thiếu phần' = int' không? – Ptival
Không, đó là lỗi đánh máy trên biểu mẫu dán bản sao REPL của tôi. Module IntType thứ hai đọc chính xác: 'module IntType: SOMETYPE = struct type t = int end' và bạn nhận được chính xác kết quả tương tự mà tôi mô tả ở trên. Tôi cũng sẽ chỉnh sửa bài đăng để tránh bất kỳ sự hiểu lầm nào. –