2012-07-10 40 views
13

Tôi đang tạo ra nhiều mảng tốt có loại chỉ mục là Bounded và có phạm vi chỉ mục là (minBound, maxBound). Đối với một mảng như vậy, kiểm tra giới hạn phải là không cần thiết. Làm thế nào tôi có thể thuyết phục GHC để loại bỏ việc kiểm tra giới hạn?Loại bỏ giới hạn mảng Haskell kiểm tra loại Bounded?

Ứng dụng cụ thể của tôi sử dụng cả các mảng không thể đóng hộp và không được đóng hộp, nhưng tôi quan tâm đến tất cả các loại mảng Haskell.

+2

Vâng, loại mảng nào? Chỉ là 'Data.Array.IArray'? –

Trả lời

13

nhập Data.Array.Base, tính toán chỉ số Int của phần tử mong muốn, và sử dụng

someArray `unsafeAt` computedIndex 

để tránh phạm vi kiểm tra (unsafeReadunsafeWrite cho mảng có thể thay đổi). Việc tính toán chỉ số Int mà không cần kiểm tra phạm vi nên có sẵn qua unsafeIndex từ lớp Ix nếu bạn import GHC.Arr.

Nếu cá thể Ix của loại chỉ mục của bạn không cung cấp chức năng unsafeIndex không được kiểm soát nhanh, bạn phải tự viết nó. Đó có thể là thích hợp hơn vì phạm vi của bạn (minBound, maxBound) là hằng số và không cần phải được chuyển đến tính toán chỉ mục.

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