2011-08-25 34 views
8

Tôi muốn xác định loại "Lý tưởng" là danh sách nhưng có một số cấu trúc. Bản dạo đầu số đã xác định các trường hợp của Ring cho các danh sách, nhưng chúng không sử dụng các định nghĩa về phép cộng và phép nhân mà tôi muốn. Vì vậy, tôi nghĩ rằng trong trường hợp này tôi nên nóiHaskell newtype, nhưng giữ chức năng cũ

newtype Ideal a = Ideal [a] 

Điều này làm việc tốt, nhưng bây giờ nó cho tôi một lỗi nếu tôi cố gắng làm, nói take 5 $ Ideal [0..].

Có cách nào để tôi có thể giữ các chức năng mình muốn và chỉ ghi đè các định nghĩa mà tôi ghi đè rõ ràng không?

Trả lời

6

Đối với các hàm thuần túy, không. Bạn sẽ phải cung cấp các định nghĩa của riêng bạn.

Tuy nhiên, đối với các chức năng thuộc loại lớp, bạn có thể sử dụng tiện ích mở rộng GeneralizedNewtypeDeriving để hiển thị các loại lớp bạn muốn từ loại cơ bản của newtype.

{-# LANGUAGE GeneralizedNewtypeDeriving #-} 
newtype MyState a = MyState (State Int a) 
    deriving (Monad) 
11

Nếu bạn không quá đặt trên những thứ đang được hoàn toàn tự động, bạn có thể sử dụng các chức năng tiện ích trong the newtype package, ví dụ một cái gì đó như over Ideal $ take 5.

Chỉnh sửa: Ngoài ra, như một sang một bên, không quá khó để mở rộng các chức năng từ gói newtype để xử lý các trường hợp khác. Ví dụ, tôi đã có những định nghĩa này nằm xung quanh:

infixl 3 ./ 
(./) :: (Newtype n o) => (o -> t) -> (n -> t) 
(./) fx = fx . unpack 

liftN f x = pack $ f ./ x 
liftN2 f x y = pack $ f ./ x ./ y 
liftN3 f x y z = pack $ f ./ x ./ y ./ z 

Không thực sự là thiết kế tốt nhất cho combinators như vậy, tôi nghi ngờ, nhưng bạn sẽ có được ý tưởng.

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