2015-12-23 8 views
6

यह मेरे लिए स्पष्ट क्यों समारोहएफ जी x = जी का प्रकार। gx

f g x = g . g x 

के रूप में परिभाषित नहीं है प्रकार

f :: (b -> a -> b) -> b -> a -> a -> b 

मैं इसे प्रकार का होगा सोचा होगा है

f :: (t -> t) -> t -> t 

किसी को भी व्याख्या कर सकते हैं मेरे लिए अभिव्यक्ति कैसे टूट गई है? धन्यवाद!

उत्तर

11

ध्यान दें कि फ़ंक्शन एप्लिकेशन की सर्वोच्च प्राथमिकता है; ऑपरेटर बाद में आते हैं।

तो, g . g x शब्द g से x पर लागू होता है, और फिर परिणाम और g स्वयं बनाता है। यदि x टाइप b है, g में b -> c टाइप होना चाहिए। चूंकि हम gg x (प्रकार के बाद) लिखते हैं, cb लौटने वाला फ़ंक्शन प्रकार होना चाहिए, इसलिए c = a -> b। अब, g का प्रकार b -> a -> b है और g . g x का प्रकार a -> (a -> b) है; f का प्रकार (b -> a -> b) -> b -> a -> a -> b होता है।

आप (a -> a) -> a -> a बजाय की तरह कुछ करना चाहता था, तो आप इस

f g x = g (g x) 
f g x = (g . g) x 
f g x = g . g $ x 
f g = g . g 
+0

तो मुझे लगता है कि जी प्रकार का है मिल (ख -> एक -> ख) लेकिन फिर मैं कैसे के प्रकार का अनुमान लगा है जी जी एक्स? – SendMeMemes

+0

@SendMeMemes संरचना ऑपरेटर '(y -> z) -> (x -> y) -> x -> z' के हस्ताक्षर की जांच करें और इसके तर्कों के प्रकार से मिलान करें: 'g' और' g x'। – lisyarus

2

विचार (.) ऑपरेटर समझने के बारे में है में से एक की कोशिश कर सकते हैं, यह

(.) :: (b -> c) -> (a -> b) -> a -> c 

का एक प्रकार यह दो कार्य लेता है प्रत्येक एक पैरामीटर के साथ और उन्हें लिखें, g x लागू करने के बाद संकलक g वास्तव में g :: a -> b -> c है (.) :: (b -> c) -> (a -> b) -> a -> c के हस्ताक्षर को संतुष्ट करने के लिए जो एक तर्क के साथ दो कार्य करता है। अन्यथा कोड संकलित नहीं होगा।

और अंत में अगर आप हस्ताक्षर चाहते f :: (t -> t) -> t -> t आप कुछ इस तरह की जरूरत है:

λ> let applyTwice g = g.g 
λ> :t applyTwice 
applyTwice :: (a -> a) -> a -> a 
λ> applyTwice (*2) 3 
12