2016-08-08 22 views
6

Tôi đã phát hiện ra rằng tôi có thể thực hiện việc này 1 :: Product Int và nhận được kết quả là Product {getProduct = 1}.hành vi kiểu mới trong Haskell

Productnewtype được xác định trong Data.Monoid. Hơn tôi đã cố gắng xác định của riêng tôi newtype như vậy:

newtype Stuff a = Stuff {getStuff :: a} deriving (Show) 

Nhưng nếu tôi cố gắng làm 1 :: Stuff Int tôi nhận được một lỗi:

<interactive>:20:1: error: 
* No instance for (Num (Stuff Int)) arising from the literal `1' 
* In the expression: 1 :: Stuff Int 
    In an equation for `it': it = 1 :: Stuff Int 

Tôi có phải đặt Num hạn chế về a hoặc một cái gì đó? Tại sao nó không hoạt động?

Trả lời

15

Bạn có thể làm 1 :: T nếu và chỉ khi T là phiên bản Num. 1 :: Product Int hoạt động vì Product xác định một thể hiện instance Num a => Num (Product a) (ví dụ: nếu a là một phiên bản Num, Product a cũng là một phiên bản Num).

Tôi có phải đặt ràng buộc Num vào một thứ gì đó không?

Bạn phải xác định ví dụ Num cho Stuff Int (hoặc tốt hơn cho Num a => Stuff a).

Bạn có thể làm điều này bằng tay (sử dụng instance) hoặc tự động sử dụng deriving NumGeneralizedNewtypeDeriving mở rộng, trong đó sẽ xác định một trường hợp Num cho Num a => Stuff a rằng hoạt động chính xác như Num dụ cho a nhất định.

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