मुझे एक ऑपरेटर - बनाने की आवश्यकता है जो दो स्ट्रिंग्स को पहली स्ट्रिंग माइनस दूसरी स्ट्रिंग के सभी वर्णों को देता है। उदाहरण के लिए: "abcd"-"ad"="bc"

रैंडम कोड लिखते समय मैंने देखा कि अगर मैं - ऑपरेटर को एक नया फ़ंक्शन असाइन करता हूं तो मैं इसे फिर से पूर्णांकों के साथ उपयोग नहीं कर सकता। उदाहरण के लिए:

# let (-) str1 str2 = (String.length str1) - (String.length str2);;
val ( - ) : string -> string -> int = <fun> 
# 1-2;;
Error: This expression has type int but an expression was expected of type
     string

मैं इसे बनाना चाहता हूं ताकि मैं पूर्णांक और स्ट्रिंग दोनों के बीच - ऑपरेटर का उपयोग कर सकूं, क्या यह ओकैमल में संभव है या क्या मुझे एक कस्टम ऑपरेटर बनाना है?

1
Jing 3 नवम्बर 2018, 14:05

1 उत्तर

सबसे बढ़िया उत्तर

OCaml तदर्थ बहुरूपता का समर्थन नहीं करता है, इसलिए किसी दिए गए नाम की केवल एक परिभाषा होगी। यदि आप नाम को एक नई परिभाषा देते हैं तो यह पूर्व को "छाया" देगा, इसे अनुपयोगी प्रदान करेगा जब तक कि आप इसे निर्दिष्ट करने के लिए अर्हता प्राप्त नहीं करते कि आप किस परिभाषा का उपयोग करना चाहते हैं (जब तक वे अलग-अलग मॉड्यूल में परिभाषित होते हैं)। इस संबंध में एक ऑपरेटर को अलग नहीं माना जाता है, यह सिर्फ एक और नाम है, यही कारण है कि आपको float को घटाने के लिए -. का उपयोग करना होगा, जबकि - केवल int के लिए है। एस।

चूँकि - को Pervasives में परिभाषित किया गया है, जो हमेशा खुला रहता है, अपने स्वयं के - ऑपरेटर को एक अलग मॉड्यूल में परिभाषित करते हुए, जो स्थानीय रूप से खोला जाता है, जहां आप इसका उपयोग करना चाहते हैं, आपको छायांकन के बारे में चेतावनी देगा, इसलिए आप आमतौर पर मौजूदा ऑपरेटरों को ओवरराइड करने से बचना चाहेंगे।

इसके बजाय, मैं केवल एक अलग अप्रयुक्त ऑपरेटर को परिभाषित करने की अनुशंसा करता हूं, जैसे --:

let (--) str1 str2 = (String.length str1) - (String.length str2);;

आप किसी भी कस्टम ऑपरेटर को इस टेबल< की संबद्धता और प्राथमिकता के अनुसार परिभाषित कर सकते हैं। /ए>

2
glennsl 3 नवम्बर 2018, 12:18