2012-01-15 10 views
5

Tôi chỉ xác định một mô-đun Matrix như sau:đa hình loại bên trong một mô-đun (OCaml)

module Matrix = 
    struct 
    type element 
    type t = element array array 

    let make (nr: int) (nc: int) (init: element) : t = 
     let result = Array.make nr (Array.make nc init) in 
     for i = 0 to nr - 1 do 
     result.(i) <- Array.make nc init 
     done; 
     result 
    end 

let m = Matrix.make 3 4 0 mang lại cho tôi một lỗi Error: This expression has type int but an expression was expected of type Matrix.element. Sau đó, tôi đã thêm 'a:

module Matrix = 
    struct 
    type element = 'a 
    type t = element array array 

    let make (nr: int) (nc: int) (init: element) : t = 
     let result = Array.make nr (Array.make nc init) in 
     for i = 0 to nr - 1 do 
     result.(i) <- Array.make nc init 
     done; 
     result 
    end 

Việc biên soạn mô-đun đưa ra lỗi Error: Unbound type parameter 'a.

Có ai cho tôi biết cách xác định loại bên trong mô-đun của mình không?

Trả lời

5

Hai vấn đề: (1) biến kiểu không thể đặt tên theo ràng buộc, như bạn đã thử với element và (2) loại t cần phải có tất cả các biến kiểu làm tham số nếu biến được định nghĩa đa hình. Nghĩa là, bạn có muốn viết

type 'a t = 'a array array 

hoặc bạn phải bật các module thành một functor, nơi bạn lấy element như một tham số của toàn bộ mô-đun.

+0

Tôi có câu hỏi, có thể thực hiện: 'module Element = struct nhập 'a t =' a để so sánh = so sánh kết thúc ;; module ElementMap = Map.Make (Element) '? Tôi nhận được "Lỗi: Chữ ký không khớp:" – codablank1

+0

Điều đó là không thể, bởi vì Map.Make mong đợi một kiểu tham số ít hơn t. Bạn sẽ cần một phiên bản khác của Bản đồ để làm cho điều đó có thể. –