2010-12-16 12 views
6

मैं कोड के इस बिट है:एसएमएल सूची समानता विचित्रता

fun foldr2(f, x::xs) = 
    if xs = [] then 
     x 
    else 
     f(x, foldr2(f, xs)) 

प्रकार हस्ताक्षर

(''a * ''a -> ''a) * ''a list -> ''a 

बहुत सीधी-सपाट लग रहा है के साथ, यह एक समारोह है कि समानता के प्रकार और एक सूची पर काम करता है लेता है xs = [] तुलना की वजह से समानता प्रकार के तर्क के रूप में। हालांकि, किसी कारण से यह (op +, [2.3, 2.7, 4.0]) जैसे इनपुट पर काम करता है, जब एसएमएल/एनजे वास्तविक में समानता प्रकार नहीं होते हैं। क्या कोई मुझे इस प्रकाश का कारण बनने पर कुछ प्रकाश डालने में मदद कर सकता है?

+1

+1, मुझे आश्चर्य है कि यह क्यों काम करता है। ऐसा लगता है जैसे एसएमएल/एनजे हालत ब्लॉक को "शून्य [2.3, 2.7, 4.0]" या इसी तरह का अनुवाद करता है। –

उत्तर

2

मुझे विश्वास है कि यह जादुई तरीके से करना है जिसमें + वास्तविकताओं के लिए अधिभारित है। मेरे लिए, यह लगभग एक कंपाइलर बग होने पर verges, हालांकि मुझे यह देखने के लिए SML97 परिभाषा को देखना होगा कि सही व्यवहार क्या है। + पर ओवरलोडिंग एसएमएल, आईएमएचओ में एक गंदा अंधेरा कोने का कुछ है।

fun f (x : real * real) = 134.5 
foldr2 (f, [1.4, 2.25, 7.0]) 
    stdIn:8.1-8.29 Error: operator and operand don't agree [equality type required] 

आप भले ही आप प्रकार की त्रुटि पैदा कर सकते हैं:

उदाहरण के लिए, यदि आप एक समारोह प्रकार real * real -> real की है कि परिभाषित करने और पारित करने के लिए है कि foldr2 एक तर्क के रूप में आप प्रकार की त्रुटि आप उम्मीद कर रहे थे मिल बस op + पर एक प्रकार की एनोटेशन जोड़ें, जो मूल रूप से मुझे इस निष्कर्ष पर पहुंचा कि यह + का अधिभार है जो रहस्यमय प्रभाव पैदा कर रहा है।

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