2012-05-03 32 views
11

Tôi đã đọc về một số vấn đề với bản ghi Haskell, đặc biệt, thực tế là hai phần tử trong cùng một mô-đun không thể có cùng tên.Bản ghi Haskell, cách tiếp cận rõ ràng hơn?

Tôi hiểu bạn có thể làm việc này bằng cách có các module riêng biệt, nhưng tôi không muốn làm điều đó và thay vào đó cố gắng tiếp cận này:

class HasX a where 
    x :: a -> X 

data D1 = D1 { d1_x :: X, ... } 
instance HasX D1 where 
    x = d1_x 

data D2 = D2 { d2_x :: X, ... } 
instance HasX D2 where 
    x = d2_x 

(này chỉ làm được, chứ không phải bộ, tôi muốn tất nhiên cần phải viết thêm mã để làm bộ).

Tuy nhiên, có vẻ như các khai báo lớp và thể hiện cho tất cả điều này có vẻ giống như bản mẫu soạn sẵn mà có thể được loại bỏ, sử dụng mẫu haskell hoặc một thứ khác.

Có thư viện hoặc phần mở rộng nào cho GHC khiến cho cách tiếp cận này ít lộn xộn hơn không?

+0

Có, oops. Đã sửa. – Clinton

+1

Hơi phức tạp hơn một chút vì hai trường có thể không có cùng loại. – augustss

+0

Vì mục đích của tôi, giả sử các trường có cùng tên có cùng loại. Tôi sẽ không có các trường có cùng tên với các loại khác nhau. – Clinton

Trả lời

5

Có vẻ như Data.Has đóng gói rất nhiều thứ bạn đang tìm kiếm. Trong từ vựng của họ, tôi nghĩ rằng loại lớp học Knows của họ gần hơn với số Has của bạn và nó cũng cung cấp chữ ký để tiêm.

Họ cũng sử dụng cơ chế gắn nhãn để xử lý vấn đề mà tôi không nghĩ bạn đã cân nhắc: các bản ghi chứa các trường có cùng loại. Họ sử dụng các nhãn cấp loại để làm điều này.

Để thuận tiện, cũng có vẻ là một số hỗ trợ cung cấp một máy phát điện cho Has dụ với mẫu Haskell trong Has-TH

Bạn có thể tìm thêm nhãn loại cấp và vật liệu kỷ lục khác có liên quan trong công trình của Oleg Type Magician, như OOHaskell (cũng với Ralf Lämmel).

+0

Bạn có thể chỉ cho tôi một số tài liệu hướng dẫn về phong cách cho 'Data.Has' (và' Has-TH' cho vấn đề đó). Nó trông giống như những gì tôi đang tìm kiếm, nhưng tôi không chắc chắn làm thế nào để đặt tất cả lại với nhau. – Clinton

+0

Thực ra, tôi đã tìm thấy điều này cho 'Data.Has': https://github.com/nonowarn/has/blob/master/examples/Announce04.lhs – Clinton

0

trình truy cập dữ liệu-mẫu có thể ít nhất là giúp viết bộ truy cập cài đặt/nhận. Có lẽ một số người có thể tìm ra mã mẫu Haskell để tạo ra các lớp và các cá thể cho mỗi tên trường bản ghi. Tuy nhiên, tôi không tự sử dụng các bản mẫu của Haskell. Nó hạn chế bạn với GHC, và thậm chí cả các phiên bản GHC cụ thể, kể từ khi thay đổi mẫu Haskell giữa các phiên bản GHC khác nhau. Có một bản ghi (lớn) cho mỗi mô-đun thực sự trả hết.

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