2017-01-06 2 views
7

में हास्केल के किसी भी प्रकार का एनालॉग बनाना, मैं जूलिया में हास्केल से Data.Either प्रकार का एनालॉग बनाना चाहता हूं। v0.5 में निम्न काम करता है:जसलिया

immutable Either{T, S} 
    left :: Nullable{T} 
    right :: Nullable{S} 
end 

either{T, S}(::Type{T}, ::Type{S}, value::T) = Either(Nullable{T}(value), Nullable{S}()) 
either{T, S}(::Type{T}, ::Type{S}, value::S) = Either(Nullable{T}(), Nullable{S}(value)) 

a = either(Int64, String, 1) 
b = either(Int64, String, "a") 

println(a) 
println(b) 

मेरा प्रश्न है: यह संभव है निम्नलिखित निर्माण काम करने के लिए:

a = Either{Int64, String}(1) 
b = Either{Int64, String}("a") 

(इस तरह से एक अतिरिक्त निर्माता समारोह की आवश्यकता नहीं है)।

ऐसा लगता है कि वस्तु बनाने के लिए पर्याप्त जानकारी होनी चाहिए, लेकिन अब तक मैं संकलक को किसी भी प्रकार के संस्करणों को स्वीकार करने के लिए राजी नहीं कर सकता; जैसे

ERROR: LoadError: MethodError: no method matching Either{T,S}(::Nullable{Int64}, ::Nullable{String}) 
+0

उन रचनाकारों को प्रकार ("बाहरी रचनाकार") की परिभाषा के बाहर (बाद) डालने का प्रयास करें। –

+0

मुझे यकीन नहीं है कि इसे कैसे काम करना है। 'या तो {टी, एस} (मूल्य :: टी) = या तो {टी, एस} (निरर्थक {टी} (मूल्य), निरर्थक {एस}())' (और 'मूल्य :: एस' के लिए एनालॉग) उत्पादन करता है बाएं हाथ में 'एस' का उपयोग अप्रयुक्त होने के बाद से एक चेतावनी है। – fjarri

+0

वैसे, आप वास्तव में ऐसा क्यों करना चाहते हैं? जूलिया में ऐसा करने के लिए यह एक अप्राकृतिक बात है, जो लगभग निश्चित रूप से किसी अन्य तरीके से बेहतर हो सकती है, उदाहरण के लिए एकाधिक प्रेषण। –

उत्तर

8

में लिखने

immutable Either{T, S} 
    left :: Nullable{T} 
    right :: Nullable{S} 

    Either(value::T) = Either(Nullable{T}(value), Nullable{S}()) 
    Either(value::S) = Either(Nullable{T}(), Nullable{S}(value)) 
end 

परिणाम ऐसा लगता है कि मैं भूल गया था कि डिफ़ॉल्ट निर्माता new साथ कहा जाता है। इस प्रकार काम करता है:

immutable Either{T, S} 
    left :: Nullable{T} 
    right :: Nullable{S} 

    Either(value::T) = new(Nullable{T}(value), Nullable{S}()) 
    Either(value::S) = new(Nullable{T}(), Nullable{S}(value)) 
end 

a = Either{Int64, String}(1) 
b = Either{Int64, String}("a") 

println(a) 
println(b) 

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