मैं अपने फ़ंक्शन के प्रकार को कैसे जान सकता हूं जिसे मैंने अभी लिखा है? फ़ंक्शन के प्रकार से पहले जानने के लिए लागू करने का नियम क्या है?

यानी मुझे एक प्रकार का फ़ंक्शन लिखना है: ('a -> int) -> 'a -> int ->'a

0
blackJarvis 13 फरवरी 2020, 22:03
उस हस्ताक्षर के साथ एक फ़ंक्शन प्राप्त करने का एकमात्र तरीका let f : ('a -> int) -> 'a -> int -> 'a = fun a b c -> b बिना किसी वस्तु जादू या साइडइफेक्ट्स (कोई अन्य 'a उत्पन्न करने का कोई तरीका नहीं है), जो शायद वह नहीं है जो आप चाहते हैं। क्या आप अपने प्रश्न को स्पष्ट कर सकते हैं क्योंकि आपने 2 अलग-अलग प्रश्न पूछे हैं
 – 
Artyer
13 फरवरी 2020, 22:19
जवाब के लिए धन्यवाद। मेरा सवाल यह था कि क्या जानने का कोई तरीका है, सीधे प्रकार से शुरू करना, ocaml में फ़ंक्शन। अभ्यास का पाठ मुझे प्रकार देता है, उदाहरण के लिए: निम्न प्रकार के साथ एक फ़ंक्शन लिखें: fun : ('a -> int) -> 'a -> int ->'a क्या जानने के लिए कोई सामान्य नियम है फ़ंक्शन मुझे लिखना है, यहां तक ​​​​कि व्यायाम भी बदल जाता है?
 – 
blackJarvis
13 फरवरी 2020, 22:29

2 जवाब

जब किसी अभ्यास में आपसे किसी दिए गए प्रकार का मान ज्ञात करने के लिए कहा जाता है, तो प्रकार आमतौर पर काफी सीमित प्रकार के प्रकारों से संबंधित होता है। आमतौर पर, प्रकार में केवल गैर-रिक्त आधार प्रकार, तीर, उत्पाद और मुक्त प्रकार के चर होते हैं (और आमतौर पर विचलन की अनुमति नहीं होती है)। और इस मामले में, फ़ंक्शन खोजने के लिए एक सामान्य एल्गोरिदम है। (दूसरे शब्दों में, प्रपोजल कैलकुलस निर्णायक है, लेकिन वास्तव में यह निर्धारित करना कि क्या एक प्रकार का निवास है OCaml में अनिर्णीत है)।

मुख्य विचार सरल बोध के साथ शुरू करना है कि आधार प्रकार का मूल्य खोजना तुच्छ है।

  • यदि मुझे x:int प्रकार का मान ढूँढना है, तो मुझे एक उत्तर पता है: 0

  • इसी तरह, अगर मुझे 'ए *' बी प्रकार का मान मिलना चाहिए, अगर मुझे पहले से ही पता है कि दोनों मान x:'a, y:'b कैसे बनाए जाते हैं तो उत्तर स्पष्ट रूप से है: (x, y)

  • अब अधिक दिलचस्प मामले पर आते हैं; अगर मुझे कोई फ़ंक्शन f: 'a -> 'b खोजने के लिए कहा जाए तो क्या करें। सरल मामला तब होता है जब मुझे पहले से ही x:'b प्रकार का मान पता होता है, एक उत्तर बस होता है: fun _ -> x। अगर मैं इस तरह के मूल्य का निर्माण नहीं कर सकता, तो मुझे इस तथ्य का उपयोग करना चाहिए कि मुझे 'a प्रकार का तर्क दिया गया है। यहां सबसे सरल निहितार्थ यह है कि मैं 'a प्रकार के मान का निर्माण करता हूं। आम तौर पर, अगर मुझसे 'ए ->' ए प्रकार के फ़ंक्शन के लिए कहा जाता है, तो स्पष्ट उत्तर मजेदार x -> x है। इस प्रकार, 'b प्रकार के मान को खोजने का प्रयास करते समय, मुझे 'a को बसे हुए प्रकार के सेट में जोड़ना चाहिए, जिसे मैं जानता हूं, मान फ़ंक्शन तर्क है। इसके अलावा, यदि 'a एक फ़ंक्शन प्रकार है और इसके तर्क का प्रकार बसे हुए प्रकारों के समूह से संबंधित है, तो मुझे इसका अनुप्रयोग भी जोड़ना चाहिए। इसी तरह, प्रत्येक प्रकार के कार्यों के लिए जो मैं एक निवासी को जानता हूं, मुझे इसे इस नए मूल्य पर लागू करने का प्रयास करना चाहिए। मुझे इसे बार-बार दोहराना होगा, लेकिन यह रुकना चाहिए क्योंकि प्रकार सरल हैं।

  • आखिरी मामला टाइप वेरिएबल्स के मामले में है: इसका उत्तर यह है कि अगर मुझे फ़ंक्शन प्रकारों के तर्क की खोज करके इस प्रकार के चर को कभी नहीं मिला है, तो मैं इस प्रकार का मान नहीं बना सकता। तो इसका उत्तर यह है कि मैं केवल एक प्रकार के चर के बराबर प्रकार का मान बना सकता हूं यदि यह उन बसे हुए प्रकारों का हिस्सा है जिन्हें मैंने फ़ंक्शन तर्कों से शुरू किया था।

संक्षेप में, आपके उदाहरण में, एल्गोरिथ्म इस प्रकार है:

f: ('a -> int) -> 'a -> int -> 'a

सबसे पहले, दिखाई देने वाला एकमात्र ठोस प्रकार int है। तो मैं सिर्फ जानकारी के साथ शुरू कर सकता हूँ

{ 0 : int } let f: ('a -> int) -> 'a -> int -> 'a

फिर मैंने एक फंक्शन मांगा। तो मुझे पता है कि मेरा जवाब फॉर्म का होगा

let f x = ...

इसके अलावा, अब मुझे x:('a -> int) प्रकार का मान पता है

{ 0:int, x: 'a -> int } let f x: 'a -> int -> 'a 

मैं जिस मूल्य का निर्माण करने का प्रयास कर रहा हूं वह अभी भी एक कार्य है। इसलिए मैं एक नया तर्क y प्रकार 'a जोड़ता हूं। इसके अलावा मुझे f: 'a -> int प्रकार का मान पता है, इसलिए मैं इसे 'a प्रकार पर लागू कर सकता हूं और एक int प्राप्त कर सकता हूं। लेकिन मुझे पहले से ही एक int पता है। आइए अपेक्षित परिणाम देखें:

{ 0:int, x: 'a -> int, y:'a } let f x y : int -> 'a  

अपेक्षित प्रकार अभी भी एक फ़ंक्शन प्रकार है। नया तर्क प्रकार एक int है, लेकिन मुझे पहले से ही पता है कि int कैसे बनाया जाए। इस प्रकार, मैं सिर्फ एक तर्क जोड़ सकता हूं:

{ 0:int, x: 'a -> int, y:'a } let f x y z: 'a  

इस बार, अपेक्षित प्रकार एक प्रकार का चर 'a है। चूंकि यह एक प्रकार का चर है, इसलिए मुझे यह खोजना होगा कि क्या मैंने सीखा कि इस तरह के प्रकार को कैसे बनाया जाए। यहाँ, उत्तर हाँ है: चर y का प्रकार 'a है। इस प्रकार मुझे पता है कि मैं y वापस कर सकता हूं, और मेरा अंतिम कार्य है:

let f x y z = y

हम एक और अधिक जटिल उदाहरण का प्रयास कर सकते हैं। क्या मैं प्रकार का मान बना सकता हूं: ('a -> 'b) -> ('b-> 'c) -> 'a -> 'c यहां कोई आधार प्रकार शामिल नहीं है। इसलिए मुझे नहीं पता कि शुरुआत में कोई प्रासंगिक मूल्य कैसे बनाया जाए:

{} let f: ('a -> 'b) -> ('b-> 'c) -> 'a -> 'c

पहले चरण पर, तर्क एक फ़ंक्शन है। इस प्रकार मैंने निर्माण करना सीख लिया है: x:('a ->'b)

{ x: 'a -> 'b } let f x : ('b-> 'c) -> 'a -> 'c

मेरे पास अभी भी एक फ़ंक्शन है, इस प्रकार मैं एक और तर्क जोड़ता हूं

{ x: 'a -> 'b, y: 'b -> 'c } let f x y: 'a -> 'c

प्रकार संगत नहीं हैं, इसलिए मुझे अगले चरण पर जाने की आवश्यकता है। मेरे पास अभी भी एक फ़ंक्शन है, इस प्रकार इस बार मैंने सीखा कि 'a कैसे बनाया जाता है

{ x: 'a -> 'b, y: 'b -> 'c, z:'a } let f x y z:'c

लेकिन रुकिए, मैं इस तथ्य से चूक गया कि 'a' प्रकार का यह मान पहले तर्क के लिए फ़ीड किया जा सकता है:

{ x: 'a -> 'b, y: 'b -> 'c, z:'a, x z:'b } let f x y z:'c

और एक बार जब मुझे पता चल जाता है कि इस मूल्य का निर्माण कैसे किया जाता है, तो मैं इसे y पर फ़ीड कर सकता हूं ताकि 'c प्रकार का एक और मूल्य प्राप्त किया जा सके।

{ x: 'a -> 'b, y: 'b -> 'c, z:'a, x z:'b, y(x z): 'c } let f x y z:'c

अब, अब और नया आवेदन बाकी है और मुझे अपने उदाहरणों के सेट में 'c प्रकार का मान खोजने का प्रयास करना चाहिए। और मेरे पास एक है: y(x z)। इस प्रकार, प्रकार के फलन का एक उदाहरण: ('a -> 'b) -> ('b -> 'c) -> 'a -> 'c है

let f x y z = y(x z)

जो शायद अधिक पहचानने योग्य है

let reverse_compose f g x = g(f x)
1
octachron 14 फरवरी 2020, 13:09

रिच टाइप सिस्टम के लिए (मुझे लगता है कि OCaml योग्य हो सकता है, लेकिन मैं टाइप थ्योरी में अच्छी तरह से शिक्षित नहीं हूं) यह अनिर्णीत है कि क्या किसी दिए गए प्रकार का कोई कार्य है। तो किसी दिए गए प्रकार के साथ फ़ंक्शन बनाने के लिए सामान्य रूप से नियमों का कोई औपचारिक सेट नहीं होता है।

हालाँकि (IMHO) यह एक सुखद पहेली है। मुझे ऐसा लगता है कि यदि आप इस प्रकार को समझ सकते हैं, तो आप समाधान के रास्ते में 85% हैं।

('a -> int) -> 'a -> int -> 'a के लिए आप देख सकते हैं कि यह तीन पैरामीटर का एक फ़ंक्शन है जो दूसरे पैरामीटर के समान प्रकार का कुछ देता है। इसके अलावा इस प्रकार के बारे में कोई अन्य जानकारी नहीं है, यानी, फ़ंक्शन को किसी भी प्रकार के दूसरे पैरामीटर के लिए बिल्कुल भी काम करना है। यह उन विभिन्न संभावनाओं की संख्या को कम करता है जिनके बारे में आपको सोचने की आवश्यकता है।

अपडेट करें

आप चीजों के प्रकार बताने के लिए OCaml टॉपलेवल का उपयोग करके इस तरह के सवालों के जवाब तैयार कर सकते हैं। उदाहरण के लिए, ऊपर @Artyer का सही उत्तर निम्न स्तर में इस तरह दिखेगा:

# let f : ('a -> int) -> 'a -> int -> 'a = fun a b c -> b;;
val f : ('a -> int) -> 'a -> int -> 'a = <fun>

यह दर्शाता है कि f का वांछित प्रकार है।

यदि आप अपने आप को एक प्रकार बताए बिना वांछित प्रकार प्राप्त करना चाहते हैं, तो आपको थोड़ी अधिक मेहनत करनी होगी। कुछ इस तरह:

# let myfun f a b = if f a + b > 17 then a else a;;
val myfun : ('a -> int) -> 'a -> int -> 'a = <fun>
2
Jeffrey Scofield 13 फरवरी 2020, 22:47
ठीक है, क्या आप मुझे सही उत्तर जानने के लिए फ़ंक्शन का एक सामान्य उदाहरण लिख सकते हैं?
 – 
blackJarvis
13 फरवरी 2020, 22:39
माफ़ करें, मुझे नहीं पता कि आप क्या माँग रहे हैं। यदि आप विभिन्न कार्यों को देखना चाहते हैं कि उनका प्रकार क्या है, तो आप आपको बताने के लिए OCaml टॉपलेवल का उपयोग कर सकते हैं। मैं अपने उत्तर में जोड़ सकता हूं यदि आप पहले से नहीं जानते कि यह कैसे करना है।
 – 
Jeffrey Scofield
13 फरवरी 2020, 22:41
नहीं, मेरे पास पहले से ही ocaml शीर्ष-स्तर है। मेरा प्रश्न था: मेरी परीक्षा में शिक्षक मुझे इस प्रकार एक अभ्यास देते हैं: निम्न प्रकार के साथ एक फ़ंक्शन लिखें: fun..... . मैं जानना चाहता था कि fun के प्रकार के साथ फ़ंक्शन लिखने के लिए, प्रकार से शुरू करने के लिए कोई सामान्य नियम है या कैसे समझना है। (..... एक सामान्य प्रकार के ocaml फ़ंक्शन के लिए खड़ा है)
 – 
blackJarvis
13 फरवरी 2020, 22:47
कोई सामान्य नियम नहीं है, यह मेरे उत्तर की बात है। यदि आप समझते हैं कि प्रकार आपको क्या बता रहा है, तो विशिष्ट मामलों (विशेषकर परीक्षा में आने वाले) के लिए फ़ंक्शन लिखना बहुत कठिन नहीं होना चाहिए। मैं आपको केवल कार्यों के प्रकार और उनके अर्थ के साथ सहज होने के लिए प्रोत्साहित करूंगा। क्षमा करें मैं इससे अधिक मदद नहीं कर सकता।
 – 
Jeffrey Scofield
13 फरवरी 2020, 22:51