2016-08-08 11 views
6

में नया प्रकार का व्यवहार मैंने पाया है कि मैं यह 1 :: Product Int कर सकता हूं और परिणामस्वरूप Product {getProduct = 1} प्राप्त कर सकता हूं।हास्केल

ProductData.Monoid में परिभाषित किया गया है। की तुलना में मैं परिभाषित करने की कोशिश की है मेरे अपने newtype तो जैसे:

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

लेकिन अगर मैं 1 :: Stuff Int करने की कोशिश मैं एक त्रुटि मिलती है:

<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 

मैं a या कुछ और पर Num बाधा डालने के लिए है? यह क्यों काम नहीं करता है?

उत्तर

15

आप 1 :: T कर सकते हैं अगर और केवल TNum का एक उदाहरण है। 1 :: Product Int काम करता है क्योंकि Product एक उदाहरण instance Num a => Num (Product a) परिभाषित करता है (यानी aNum का एक उदाहरण है, Product aNum का एक उदाहरण भी है)।

क्या मुझे किसी चीज़ पर न्यू बाधा डालना है?

आप Stuff Int (या Num a => Stuff a के लिए बेहतर) के लिए एक Num उदाहरण परिभाषित करने के लिए किया है।

आप यह कर सकते हैं या तो स्वयं (instance का प्रयोग करके) या स्वचालित रूप से deriving Num और GeneralizedNewtypeDeriving विस्तार है, जो Num a => Stuff a कि वास्तव में दिए गए a के लिए Num उदाहरण की तरह काम करता लिए एक Num उदाहरण परिभाषित करेगा का उपयोग कर।