2012-03-17 32 views
5

Có cách nào để kiểm tra tĩnh trên mảng Haskell không? Chúng ta hãy xem đoạn mã này:Kiểm tra giới hạn tĩnh trên mảng Haskell

import Data.Array 
let a = listArray (0, 10) [-3.969683028665376e+01, 2.209460984245205e+02, -2.759285104469687e+02, 1.383577518672690e+02, -3.066479806614716e+01, 2.506628277459239e+00] 

(0, 10) thực sự nên (0, 5), nhưng trình biên dịch chấp nhận mã. Lỗi này chỉ được phát hiện trong thời gian chạy, mặc dù thực tế là nó có thể được phát hiện tại thời gian biên dịch.

+2

Có lẽ nó có thể được phát hiện * trong trường hợp này * - ** nếu ** trình biên dịch thực hiện rất nhiều nội tuyến và liên tục gấp để đạt được một lỗi 'vô điều kiện' (hoặc bất kỳ) vô điều kiện nào. Trong hầu hết các chương trình không phát triển, nó không thể được phát hiện, ít nhất là không phải với nỗ lực hợp lý. Và sau đó có vấn đề này ngăn chặn pesky ... – delnan

+0

Sử dụng [Habit] (http://hasp.cs.pdx.edu/habit-report-Nov2010.pdf) (PDF) Các loại Ix để có được một bảo đảm tĩnh của giới hạn. Điểm thưởng nếu bạn chuyển công việc này sang Haskell. –

+0

Có một cách, nhưng quá bất tiện khi thực tế. Để biết thêm thông tin về điều này, hãy thử tìm kiếm trên web cho "số lượng cấp loại haskell". –

Trả lời

7

Điều này không thể được phát hiện tại thời gian biên dịch, vì không có gì trong loại danh sách tiết kiệm kích thước của nó, do đó, chức năng listArray không thể thực hiện kiểm tra như vậy. Ngoài ra, nếu dữ liệu đến từ một tập tin bên ngoài (ví dụ), nó sẽ rất khó khăn để kiểm tra kích thước tĩnh hoạt động.

Bạn cần hệ thống loại phụ thuộc như hệ thống bạn tìm thấy trong Agda cho những việc như thế này để có thể.

+0

Nội dung được tạo không phải là danh sách, mà là một mảng (Data.Array). –

+0

Có, nhưng bạn đang sử dụng danh sách để tạo mảng. Bạn làm 'listArray (bắt đầu, kết thúc) someList'. – dflemstr

+0

Nhưng trong đoạn mã này, 'someList' được trình bày rõ ràng với trình biên dịch, vì vậy nó có thể thực hiện kiểm tra dễ dàng. Nhưng tôi nghĩ rằng tôi hiểu nó bây giờ: Data.Array không phải là một loại Haskell bản địa. –

Các vấn đề liên quan