2011-03-27 3 views
7

Tôi gặp vấn đề nhỏ khi triển khai mảng trong ocaml. Ví dụ, khi vào nhà ga (Konsole) và tôi gõTriển khai Ocaml

let tab = Array.make 5 6; 

Tôi có

val tab : int array = [|6; 6; 6; 6; 6|] 

như một đầu ra. Vì vậy, nó tạo ra một mảng với chiều dài là 5 và điền vào tất cả các trường hợp với 6. Được rồi, tôi hiểu phần đó. Nhưng khi tôi gõ nó vào một trình soạn thảo văn bản như kate chẳng hạn, lưu nó và biên dịch nó, tôi nhận được lỗi này:

Error: Unbound value Array.make 

Tôi không hiểu tại sao nó lại lấy Array. làm giá trị bằng kate và nó lấy Array.make như một hàm trong terminal. Tôi đã lưu tệp có đuôi ".ml" và tôi biên dịch nó bằng cách sử dụng ocamlc -o test name_of_file. Mọi đề xuất xin vui lòng? Cảm ơn.

Trả lời

5

Tôi đã biên soạn chương trình của bạn với ocamlc và nó hoạt động tốt (sử dụng OCaml 3.12.0).

Tôi đoán bạn đang gọi phiên bản cũ của trình biên dịch khi bạn cố biên dịch, có lẽ một từ khi Array.make vẫn được đặt tên là Array.create. Có lẽ khi bạn cài đặt phiên bản mới, bạn ghi đè một số tệp (chẳng hạn như toplevel) nhưng không ghi đè lên các tệp khác (chẳng hạn như trình biên dịch). Để kiểm tra, hãy so sánh các phiên bản được cung cấp bởi ocamlc -vocaml.

Đối với thông báo “Giá trị chưa được gửi”, trong OCaml, hàm là các giá trị. Những người triển khai đã không phân biệt giữa “Giá trị không phải là một hàm” và “Giá trị không phải là hàm”, nhưng đây không phải là nguyên nhân của vấn đề. Nguyên nhân của sự cố là Array.make không bị ràng buộc.

+0

Cả hai đều cho tôi phiên bản giống nhau. Phiên bản 3.11.2. Tôi không nghĩ rằng tôi ghi đè lên bất kỳ tập tin thuộc về một phiên bản trước đó. Tôi chỉ cần cài đặt Linux trên máy tính của tôi, vì vậy tôi không có kiến ​​phiên bản trước của ocaml. Tôi xác minh bằng cách chỉ cần gõ ocaml và nó đã viết rằng ocaml chưa được cài đặt, vì vậy tôi chỉ cần cài đặt nó .. phiên bản này 3.11.2. Tôi đã thử Array.create nhưng tôi vẫn nhận được cùng một vấn đề. Bạn có nghĩ rằng đó là vì phiên bản tôi đang sử dụng? – mkab

+0

@mktab Nó chắc chắn sẽ hoạt động với phiên bản 3.11.2. Phiên bản 3.12.0 sẽ cho bạn biết nếu đó là mô-đun 'Array' hoặc chức năng' make' trong đó là unbound, một trong nhiều cải tiến nhỏ mà phiên bản này mang lại, nhưng lỗi bạn đang nhận được vẫn còn là một bí ẩn. –

+2

@mktab Có khả năng tệp .../lib/ocaml/array.cmi không được trình biên dịch tìm thấy. Có lẽ nó bị thiếu, hoặc gói phân phối của bạn đã được chuẩn bị không đúng cách bằng cách sao chép các tập tin trong một đích khác ngoài trình biên dịch đã được cấu hình để cài đặt. Nếu đúng, bạn có thể sửa nó bằng cách sử dụng tùy chọn -I và -L, nhưng tôi 'd khuyên bạn nên biên dịch lại OCaml từ các nguồn. –

3

Tôi đã tìm thấy lỗi. Nó rất ngu ngốc. Tôi đã lưu tệp của mình dưới dạng "array.ml". Vì vậy, trong quá trình biên dịch, nó tạo ra một tệp array.cmi và tôi nghĩ rằng nó đã nhầm lẫn tệp này với tệp được tìm thấy trong .../lib/ocaml/array.cmi. Tôi không chắc lắm. Vì vậy, tôi đổi tên tệp thành "table.ml" và nó được biên dịch hoàn hảo. Thật điên rồ khi nhầm lẫn hai tệp này

+0

Làm thế nào để xác định rõ ràng '../ lib/ocaml/array.cmi' sau đó? – updogliu