2013-06-27 26 views
11

Tôi đang đọc mã nguồn của Data.Map và tôi thấy rằng!() Được sử dụng trong hàm tạo dữ liệu của data Map k a.() nghĩa là gì trong trình tạo dữ liệu?

data Map k a = Tip 
       | Bin {-# UNPACK #-} !Size !k a !(Map k a) !(Map k a) 

Tôi thấy rằng số !() không ảnh hưởng đến cách vỗ phù hợp với dữ liệu. Trong chức năng của mapWithKey, kết hợp patten vẫn còn cho 5 thứ. Vì vậy, tôi không coi nó như là một nhà điều hành.

mapWithKey f (Bin sx kx x l r) 

Sau khi googleing, tôi thấy rằng !() có thể liên quan đến -XBangPatterns được sử dụng để đánh giá lười biếng. Tôi có đúng không? Hay là vì mục đích khác?

Trả lời

20

! trong khai báo kiểu dữ liệu được sử dụng để cho biết mức độ nghiêm ngặt. Nếu chúng tôi search for it on Hoogle, chúng tôi sẽ thấy liên kết đến keyword !, giải thích hành vi này. Báo cáo defines hành vi chính xác.

Trong data Foo = Foo ... !T ..., hàm tạo Foo buộc đối số của nó, tức là Foo ... x ... = x `seq` RealFoo ... x .... trong đó RealFoo là hàm tạo mà bạn sẽ nhận được mà không cần !.

{-# UNPACK #-} là phần mở rộng GHC có nghĩa là Size (tức là Int) được lưu trữ không được hộp, trực tiếp như một phần của loại dữ liệu.

+0

Cảm ơn câu trả lời của bạn. Oh, vậy tôi hoàn toàn sai? Nó không phải là để đánh giá lười biếng, nhưng để đánh giá các giá trị của các đối số. Nhưng tôi không chắc chắn lý do tại sao các gói lực lượng nghiêm ngặt trên bản đồ. Nếu không có sự khắt khe, chúng ta vẫn có thể thực hiện tìm kiếm, lập bản đồ khi chúng ta đang đi mặc dù cây của bản đồ là – code4j

+0

'Data.Map' là cột sống nghiêm ngặt cho hiệu quả. Thực sự, hiệu quả là lý do chính khiến mọi người thường quan tâm đến việc thêm độ nghiêm ngặt. – shachaf

+0

Cảm ơn bạn đã giải thích :) – code4j

3

Trong trình tạo dữ liệu! cho biết các đối số được đánh giá là loại được xây dựng. Lực lượng này có chức năng được đánh giá và giúp bạn kiểm soát các yêu cầu về không gian của ứng dụng của bạn.

Trang trình bày high-performance Haskell trình bày chi tiết hơn.

+3

'BangPatterns' là tiện ích mở rộng hoạt động khác. Đây chỉ là một lĩnh vực nghiêm ngặt. – shachaf

+0

Cảm ơn bạn đã sửa đổi sự hiểu lầm của tôi! –

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