2016-02-09 5 views
5

मान लीजिए कि हास्केल के फ़ंक्शन एप्लिकेशन ("स्पेस" ऑपरेटर) भाषा में बेक्ड के बजाय टाइपक्लास में थे। मुझे लगता है यह कैसाक्या होगा यदि फ़ंक्शन एप्लिकेशन टाइपक्लास था?

class Apply f where 
    ($) :: f a r -> a -> r 

instance Apply (->) where 
    ($) = builtinFnApply# 

और f a कुछ f $ a को desugar होगा विचार करेंगे। विचार यह है कि यह आपको अन्य प्रकारों को परिभाषित करने देता है जो कार्यों की तरह कार्य करते हैं, यानी

instance Apply LinearMap where 
    ($) = matrixVectorMult 

और इसी तरह।

क्या यह प्रकार का अनुमान अपरिहार्य बनाता है? मेरा वृत्ति कहता है कि यह करता है, लेकिन टाइप अनुमान की मेरी समझ सादे हिंडली-मिलनर पर रुक जाती है। अनुवर्ती के रूप में, यदि यह अपरिहार्य है, तो इसे कुछ पैथोलॉजिकल उदाहरणों को दूर करके निर्णायक बनाया जा सकता है?

उत्तर

5

यदि आप इसे हास्केल के शीर्ष पर एक वाक्य रचनात्मक चीनी के रूप में देख सकते हैं ("स्पेस ऑपरेटर" को बदलकर), मैं नहीं देख सकता कि इसे टाइप अनुमान को पहले से कहीं भी बदतर क्यों बनाना चाहिए।

हालांकि मैं देख सकता हूं कि कोड इस परिवर्तन के साथ अधिक अस्पष्ट हो सकता है, उदा।

class C a where get :: a 
instance C (Int -> Int) where get = id 
instance C Linearmap where get = ... 

test = get (5 :: Int) -- actually being (get $ (5 :: Int)) 

get से ऊपर दोनों मामलों से चुना जा सकता है, जबकि इस तरह के अस्पष्टता सादा हास्केल में ही नहीं उठता।

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