2016-07-07 3 views
6

datatype घोषणाओं में, मानक एमएल समानता प्रकार का उत्पादन करेगा यदि सभी प्रकार के सभी प्रकार के तर्क स्वयं eqtype एस हैं।एसएमएल प्रकार को रचनाकारों को छुपाए बिना eqtype बनने से रोकें

मैं उन की अक्षमता समानता के लिए अपने स्वयं के परिभाषा प्रदान और अपने स्वयं के eqtypes और एसएमएल नियमों के अप्रत्याशित परिणाम (निर्माण करने के लिए रोना रोते कुछ स्थानों में टिप्पणी देखा है जैसे नंगे ref और array रों eqtypes हैं, लेकिन datatype Foo = Foo of (real ref) एक eqtype नहीं है)।

स्रोत: http://mlton.org/PolymorphicEquality

एक है क्योंकि एक रेफरी सेल पर सूचक तुलना पर्याप्त होगा, प्रकार वास्तविक टी के दो मानों की तुलना करने में सक्षम होने की उम्मीद कर सकते हैं। दुर्भाग्यवश, टाइप सिस्टम केवल यह व्यक्त कर सकता है कि उपयोगकर्ता द्वारा परिभाषित डेटाटाइप समानता स्वीकार करता है या नहीं।

मुझे आश्चर्य है कि ब्लॉक eqtyping संभव है या नहीं। उदाहरण के लिए, मैं एक बाइनरी पेड़ (एक अनावश्यक संस्करण के साथ) के रूप में एक सेट को कार्यान्वित कर रहा हूं और मैं संरचनात्मक रूप से एक दूसरे के साथ सेट की तुलना करने की क्षमता को प्रतिज्ञा करना चाहता हूं।

datatype 'a set = EmptySet | SetLeaf of 'a | SetNode of 'a * 'a set * 'a set; 

कहो मैं लोगों को = साथ SetLeaf(5) और SetNode(5, EmptySet, EmptySet) भेद करने के बाद से यह एक अमूर्त तोड़ने आपरेशन है में सक्षम हो नहीं करना चाहती।

मैं datatype on = On | Off साथ एक सरल उदाहरण की कोशिश की सिर्फ अगर मैं एक गैर eqtype हस्ताक्षर का उपयोग करने के प्रकार अवनत आ सकती हैं।

(* attempt to hide the "eq"-ness of eqtype *) 
signature S = sig 
    type on 
    val foo : on 
end 

(* opaque transcription to kill eqtypeness *) 
structure X :> S = struct 
    datatype on = On | Off 
    let foo = On 
end 

ऐसा लगता है कि पारदर्शी जोड़ना एक eqtype बनने से X.on को रोकने के लिए विफल रहता है, लेकिन अपारदर्शी जोड़ना इसे रोक नहीं करता है। हालांकि, ये समाधान आदर्श नहीं हैं क्योंकि वे एक नया मॉड्यूल पेश करते हैं और डेटा कन्स्ट्रक्टर को छुपाते हैं। कस्टम प्रकार या टाइपर को eqtype बनने या अपने डेटा कन्स्ट्रक्टर को छुपाए बिना या नए मॉड्यूल पेश किए बिना समानता को स्वीकार करने का कोई तरीका है?

उत्तर

6

संक्षिप्त उत्तर नहीं है। जब एक प्रकार की परिभाषा दिखाई दे रही है, तो यह परिभाषा है कि परिभाषा का अर्थ है। ईक होने से रोकने का एकमात्र तरीका यह है कि परिभाषा को ट्विक करना है, उदाहरण के लिए, real पैरामीटर के साथ एक डमी कन्स्ट्रक्टर जोड़कर।

बीटीडब्ल्यू, छोटे सुधार: आपके प्रकार foo समानता प्रकार होना चाहिए। यदि आपका एसएमएल कार्यान्वयन असहमत है तो इसमें एक बग है। एक अलग मामला real bar है जब datatype 'a bar = Bar of 'a ref (जो एमएलटन मैनुअल चर्चा करता है)। पहला कारण यह है कि दूसरा काम करता है लेकिन दूसरा यह नहीं है कि ref एसएमएल में जादू है: इसमें पॉलिमॉर्फिक ईक-नेस का एक रूप है जो उपयोगकर्ता प्रकार नहीं हो सकता है।

+0

आरई। 'बार 'मामला, मेरी गलती। एसएमएल/एनजे ने 'डेटाटाइप' को आपके द्वारा वर्णित एक बार 'मामले को खारिज कर दिया है, लेकिन 'डेटाटाइप फू = फू (असली रेफरी)' मामले में, इस मामले में मैंने शुरुआत में सवाल किया था कि यह 'पॉलीक्वाल' को कॉल करने के बारे में एक बुरा चेतावनी छोड़ देता है। –

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