2014-05-07 9 views
6

जब मैं किसी फ़ंक्शन में आता हूं, तो यह निर्धारित करने का एक सामान्य तरीका है कि यह पूरी तरह से अकेले या एक प्रकार के वर्ग का हिस्सा है या नहीं? उदाहरण के लिए:यह निर्धारित करना कि कोई फ़ंक्शन स्टैंड-अलोन या एक प्रकार का वर्ग है

fromIntegral :: (Integral a, Num b) => a -> b 

इस विधि मैं जवाब खोजने के लिए विकसित किया है है:

  1. जाओ GHCi करने और इस मामले :info Integral और :info Num में सभी सूचीबद्ध वर्ग की कमी पर :info करते हैं।
  2. जांचें कि उनमें से कोई भी फ़ंक्शन सूचीबद्ध करता है या नहीं।
  3. यदि ऐसा होता है, तो यह उस प्रकार की कक्षा का हिस्सा है। यदि ऐसा नहीं होता है, तो यह एक स्टैंडअलोन फ़ंक्शन है (जो forIntegral के मामले में है)।

क्या मेरी विधि ध्वनि है? क्या यह सामान्य रूप से काम करता है?

उत्तर

12

आप सीधे फ़ंक्शन पर :info कर सकते हैं।

Prelude> :info fromInteger 
class Num a where 
    ... 
    fromInteger :: Integer -> a 
     -- Defined in `GHC.Num' 

Prelude> :info fromIntegral 
fromIntegral :: (Integral a, Num b) => a -> b 
     -- Defined in `GHC.Real' 

जैसा कि आप देख, fromInteger, Num typeclass के अंतर्गत आता है, जबकि fromIntegral नहीं करता है।

7

एक आसान तरीका नहीं है, :info fromIntegral और :info fromInteger के लिए उत्पादन में अंतर की तुलना:

> :info fromIntegral 
fromIntegral :: (Integral a, Num b) => a -> b 
     -- Defined in `GHC.Real' 
> :info fromInteger 
class Num a where 
    ... 
    fromInteger :: Integer -> a 
     -- Defined in `GHC.Num' 

देखें कैसे fromInteger एक प्रकार वर्ग के हिस्से के रूप में निर्दिष्ट किया जाता है, लेकिन fromIntegral नहीं है? इस तरह आप बता सकते हैं।

संबंधित मुद्दे