2010-03-13 31 views
9

Khi làm việc với các thể hiện có nguồn gốc trong Haskell, có thể lấy được các hàm cho các loại tùy ý hoặc chúng tôi bị hạn chế đối với các chức năng cụ thể không?Phát sinh các chức năng tùy ý trong Haskell

+0

Hehe, +1 nếu bạn tìm thấy điều này bởi vì bạn đang hy vọng bạn có thể lấy được 'Test.QuickCheck.Arbitrary' cho ADT. :) –

Trả lời

9

Bạn có thể lấy trường hợp của các lớp sau trong haskell 98: Eq, Ord, Enum, Ix, Bounded, Read và Show.

Sử dụng tiện ích mở rộng ghc, bạn cũng có thể lấy được các trường hợp của các lớp sau: Có thể đánh máy, Dữ liệu, Functor, Có thể gập lại và truyền tải. Ngoài ra còn có một phần mở rộng ghc cho phép một newtype lấy được các thể hiện từ kiểu triển khai của nó.

Bạn không thể tìm thấy trường hợp các lớp tùy ý vì lý do đơn giản mà haskell sẽ không biết cách tạo các chức năng cần thiết mà không có kiến ​​thức đặc biệt về lớp được đề cập.

+0

Nhưng GHC có thể xử lý một số trường hợp đơn giản. Nếu bạn nói 'newtype Bar = Bar Foo' và Foo có một cá thể Quux, thì GeneralizedNewtypeDeriving có thể lấy được cá thể Quux cho Bar cho bạn. Tất nhiên, đây chỉ là việc tháo gỡ tầm thường, nhưng nó tốt hơn là không có gì. – jrockway

6

Bạn bị hạn chế đối với các lớp cụ thể, về mặt trình biên dịch biết cách lấy được cho bạn. Sử dụng một bộ tiền xử lý, hoặc mẫu Haskell, bạn có thể tự mình mã hóa các cơ chế truy xuất mới, nếu bạn biết các cách tiếp cận chung để sinh năng thực hiện các hàm cho các kiểu cụ thể.

6

Hai câu trả lời còn lại là chính xác. Nhưng nếu bạn cần nhiều hơn, có một số gói về hackage có thể xử lý nhiều hơn. Tôi thích Data.Derive rất nhiều, vì bạn có thể tạo mã nguồn trực tiếp (để tương thích) hoặc móc nó vào Mẫu Haskell để làm điều đó tại thời gian biên dịch. Một loạt các lớp học đã được hỗ trợ và rất dễ dàng để thêm hỗ trợ cho riêng bạn. Tóm tắt: sân quảng cáo cho một thư viện chết tiệt tốt :-)

+0

Bây giờ tôi lấy lại cái này. Lúc đó tôi không cố gắng thêm hỗ trợ cho riêng mình, nhưng tôi cho rằng nó rất dễ. Nó không phải là; nó liên quan đến việc biên dịch lại thư viện từ những gì tôi có thể nói. Nhưng vẫn còn hỗ trợ được xây dựng trong là tốt đẹp và đầy đủ. – luqui

4

Để thêm vào câu trả lời của Don: bắt nguồn chức năng tùy chỉnh cho kiểu dữ liệu được gọi là generic programming và có một lot of literature về việc này. Preprocessor và Template Haskell không phải là giải pháp duy nhất; xem một trong những bài báo tổng quan mà danh sách các tài liệu cho các tùy chọn khác.

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