Julia Language
प्रकार
खोज…
वाक्य - विन्यास
- अपरिवर्तनीय MyType; खेत; खेत; समाप्त
- टाइप MyType; खेत; खेत; समाप्त
टिप्पणियों
प्रकार जूलिया के प्रदर्शन के लिए महत्वपूर्ण हैं। प्रदर्शन के लिए एक महत्वपूर्ण विचार प्रकार की स्थिरता है , जो तब होता है जब कोई फ़ंक्शन वापस लौटता है, केवल प्रकारों पर निर्भर करता है, मूल्यों पर नहीं, इसके तर्कों पर।
प्रकारों पर प्रेषण
जूलिया पर, आप प्रत्येक फ़ंक्शन के लिए एक से अधिक विधि परिभाषित कर सकते हैं। मान लें कि हम एक ही कार्य के तीन तरीके परिभाषित करते हैं:
foo(x) = 1
foo(x::Number) = 2
foo(x::Int) = 3
निर्णय लेने के लिए किस विधि का उपयोग किया जाता है (जिसे प्रेषण कहा जाता है), जूलिया अधिक विशिष्ट विधि चुनती है जो तर्कों के प्रकारों से मेल खाती है:
julia> foo('one')
1
julia> foo(1.0)
2
julia> foo(1)
3
यह बहुरूपता की सुविधा देता है । उदाहरण के लिए, हम आसानी से दो अपरिवर्तनीय प्रकारों को परिभाषित करके एक लिंक सूची बना सकते हैं, जिनका नाम Nil
और Cons
। इन नामों को क्रमशः एक खाली सूची और एक गैर-रिक्त सूची का वर्णन करने के लिए उपयोग किया जाता है।
abstract LinkedList
immutable Nil <: LinkedList end
immutable Cons <: LinkedList
first
rest::LinkedList
end
हम Nil()
और किसी भी अन्य सूचियों को Cons(first, rest)
द्वारा खाली सूची का प्रतिनिधित्व करेंगे, जहां first
लिंक की गई सूची का पहला तत्व है और rest
सभी शेष तत्वों से मिलकर जुड़ी हुई सूची है। उदाहरण के लिए, सूची [1, 2, 3]
का प्रतिनिधित्व किया जाएगा
julia> Cons(1, Cons(2, Cons(3, Nil())))
Cons(1,Cons(2,Cons(3,Nil())))
क्या सूची खाली है?
मान लीजिए कि हम मानक पुस्तकालय के isempty
कार्य को isempty
हैं, जो विभिन्न प्रकार के संग्रह पर काम करता है:
julia> methods(isempty)
# 29 methods for generic function "isempty":
isempty(v::SimpleVector) at essentials.jl:180
isempty(m::Base.MethodList) at reflection.jl:394
...
हम केवल फ़ंक्शन प्रेषण सिंटैक्स का उपयोग कर सकते हैं, और isempty
दो अतिरिक्त तरीकों को isempty
। चूंकि यह फ़ंक्शन Base
मॉड्यूल से है, इसलिए हमें इसका विस्तार करने के लिए इसे Base.isempty
रूप में अर्हता प्राप्त करनी होगी।
Base.isempty(::Nil) = true
Base.isempty(::Cons) = false
यहां, हमें यह निर्धारित करने के लिए तर्क मानों की आवश्यकता नहीं थी कि सूची खाली है या नहीं। केवल उस जानकारी की गणना करने के लिए केवल प्रकार ही पर्याप्त होता है। जूलिया हमें केवल उनके प्रकार के एनोटेशन रखते हुए, तर्कों के नामों को छोड़ने की अनुमति देता है, अगर हमें उनके मूल्यों का उपयोग करने की आवश्यकता नहीं है।
हम परीक्षण कर सकते हैं कि हमारी isempty
विधियाँ काम करती हैं:
julia> using Base.Test
julia> @test isempty(Nil())
Test Passed
Expression: isempty(Nil())
julia> @test !isempty(Cons(1, Cons(2, Cons(3, Nil()))))
Test Passed
Expression: !(isempty(Cons(1,Cons(2,Cons(3,Nil())))))
और वास्तव में isempty
लिए तरीकों की संख्या में 2
वृद्धि हुई है:
julia> methods(isempty)
# 31 methods for generic function "isempty":
isempty(v::SimpleVector) at essentials.jl:180
isempty(m::Base.MethodList) at reflection.jl:394
स्पष्ट रूप से, यह निर्धारित करना कि एक लिंक की गई सूची खाली है या नहीं यह एक तुच्छ उदाहरण है। लेकिन यह कुछ और दिलचस्प है:
सूची कब तक है?
मानक पुस्तकालय से length
समारोह हमें एक संग्रह या कुछ पुनरावृत्तियों की लंबाई देता है। लिंक की गई सूची के लिए length
को लागू करने के कई तरीके हैं। विशेष रूप से, while
लूप का उपयोग करने की संभावना सबसे तेज़ और जूलिया में सबसे अधिक मेमोरी-कुशल है। लेकिन समय से पहले अनुकूलन से बचा जाना है, तो चलो एक दूसरे के लिए मान लें कि हमारी लिंक की गई सूची को कुशल होने की आवश्यकता नहीं है। length
फ़ंक्शन लिखने का सबसे सरल तरीका क्या है?
Base.length(::Nil) = 0
Base.length(xs::Cons) = 1 + length(xs.rest)
पहली परिभाषा सीधी है: एक खाली सूची की लंबाई 0
। दूसरी परिभाषा को पढ़ना भी आसान है: किसी सूची की लंबाई को गिनने के लिए, हम पहले तत्व को गिनते हैं, फिर बाकी की सूची की लंबाई को गिनते हैं। हम इस पद्धति का परीक्षण उसी तरह से कर सकते हैं जैसे हमने isempty
परीक्षण किया isempty
:
julia> @test length(Nil()) == 0
Test Passed
Expression: length(Nil()) == 0
Evaluated: 0 == 0
julia> @test length(Cons(1, Cons(2, Cons(3, Nil())))) == 3
Test Passed
Expression: length(Cons(1,Cons(2,Cons(3,Nil())))) == 3
Evaluated: 3 == 3
अगला कदम
यह खिलौना उदाहरण उन सभी कार्यक्षमता को लागू करने से बहुत दूर है जो एक लिंक की गई सूची में वांछित होंगे। मिसाल के तौर पर यह गायब है। हालांकि, यह दिखाता है कि छोटे और स्पष्ट कोड लिखने के लिए प्रेषण का उपयोग कैसे किया जा सकता है।
अपरिवर्तनीय प्रकार
सबसे सरल मिश्रित प्रकार एक अपरिवर्तनीय प्रकार है। अपरिवर्तनीय प्रकार के उदाहरण की तरह tuples , मान हैं। उनके बनाए जाने के बाद उनके खेतों को नहीं बदला जा सकता है। कई मायनों में, एक अपरिवर्तनीय प्रकार एक Tuple
तरह है, जो स्वयं प्रकार और प्रत्येक क्षेत्र के लिए नामों के साथ है।
सिंगलटन प्रकार
समग्र प्रकार, परिभाषा के अनुसार, कई सरल प्रकार होते हैं। जूलिया में, यह संख्या शून्य हो सकती है; अर्थात्, एक अपरिवर्तनीय प्रकार को कोई फ़ील्ड शामिल करने की अनुमति है। यह खाली टपल ()
बराबर है।
यह उपयोगी क्यों हो सकता है? ऐसे अपरिवर्तनीय प्रकारों को "सिंगलटन प्रकार" के रूप में जाना जाता है, क्योंकि उनमें से केवल एक ही उदाहरण कभी भी मौजूद हो सकता है। इस प्रकार के मूल्यों को "सिंगलटन मान" के रूप में जाना जाता है। मानक लाइब्रेरी Base
में कई ऐसे सिंगलटन प्रकार होते हैं। यहाँ एक संक्षिप्त सूची है:
-
Void
,nothing
का प्रकार। हम सत्यापित कर सकते हैं किVoid.instance
(जो एक सिंगलटन प्रकार के सिंगलटन मान को पुनः प्राप्त करने के लिए विशेष वाक्यविन्यास है) वास्तव मेंnothing
। - कोई भी मीडिया प्रकार, जैसे कि
MIME"text/plain"
, एकल उदाहरण के साथ एक सिंगलटन प्रकार है,MIME("text/plain")
। -
Irrational{:π}
,Irrational{:π}
,Irrational{:e}
,Irrational{:φ}
, और इसी प्रकार के एक प्रकार के सिंगलटन प्रकार हैं, और उनके सिंगलटन के उदाहरण तर्कहीन मूल्य हैंπ = 3.1415926535897...
, आदि। - इटरेटर का आकार
Base.HasLength
,Base.HasShape
,Base.IsInfinite
, औरBase.SizeUnknown
सभी सिंगलटन प्रकार केBase.SizeUnknown
हैं।
- संस्करण 0.5 और बाद में, प्रत्येक फ़ंक्शन एक सिंगलटन प्रकार का एक एकल उदाहरण है! किसी भी अन्य एकल मूल्य की तरह, हम फ़ंक्शन
sin
को पुनर्प्राप्त कर सकते हैं, उदाहरण के लिए,typeof(sin).instance
।
क्योंकि उनके पास कुछ भी नहीं है, सिंगलटन प्रकार अविश्वसनीय रूप से हल्के होते हैं, और उन्हें अक्सर संकलक द्वारा दूर किया जा सकता है जिसमें कोई रनटाइम ओवरहेड न हो। इस प्रकार, वे लक्षण, विशेष टैग मूल्यों और ऐसे कार्यों के लिए एकदम सही हैं जो एक विशेषज्ञ पर करना चाहते हैं।
एक एकल प्रकार को परिभाषित करने के लिए,
julia> immutable MySingleton end
सिंगलटन प्रकार के लिए कस्टम प्रिंटिंग को परिभाषित करने के लिए,
julia> Base.show(io::IO, ::MySingleton) = print(io, "sing")
एकल उदाहरण का उपयोग करने के लिए,
julia> MySingleton.instance
MySingleton()
अक्सर, एक व्यक्ति इसे एक नियत स्थान पर भेजता है:
julia> const sing = MySingleton.instance
MySingleton()
आवरण के प्रकार
यदि शून्य-फ़ील्ड अपरिवर्तनीय प्रकार दिलचस्प और उपयोगी हैं, तो शायद एक-फ़ील्ड अपरिवर्तनीय प्रकार और भी अधिक उपयोगी हैं। ऐसे प्रकारों को आमतौर पर "रैपर प्रकार" कहा जाता है क्योंकि वे कुछ अंतर्निहित डेटा को लपेटते हैं, उक्त डेटा के लिए एक वैकल्पिक इंटरफ़ेस प्रदान करते हैं। Base
में एक रैपर प्रकार का एक उदाहरण String
। हम String
समान प्रकार को परिभाषित करेंगे, जिसका नाम MyString
। यह प्रकार बाइट्स ( UInt8
) के एक वेक्टर (एक आयामी सरणी ) द्वारा समर्थित होगा।
सबसे पहले, प्रकार ही परिभाषा और कुछ अनुकूलित दिखा:
immutable MyString <: AbstractString
data::Vector{UInt8}
end
function Base.show(io::IO, s::MyString)
print(io, "MyString: ")
write(io, s.data)
return
end
अब हमारा MyString
प्रकार उपयोग के लिए तैयार है! हम इसे कुछ कच्चे UTF-8 डेटा को खिला सकते हैं, और जैसा कि हम इसे पसंद करते हैं:
julia> MyString([0x48,0x65,0x6c,0x6c,0x6f,0x2c,0x20,0x57,0x6f,0x72,0x6c,0x64,0x21])
MyString: Hello, World!
जाहिर है, इस स्ट्रिंग प्रकार को बहुत अधिक काम करने की आवश्यकता है क्योंकि यह Base.String
प्रकार के रूप में उपयोग करने योग्य हो जाता है।
सही मिश्रित प्रकार
शायद सबसे अधिक, कई अपरिवर्तनीय प्रकारों में एक से अधिक क्षेत्र होते हैं। एक उदाहरण मानक पुस्तकालय है Rational{T}
एक: प्रकार है, जो दो fieds शामिल num
अंश के लिए क्षेत्र, और एक den
भाजक के लिए क्षेत्र। इस प्रकार के डिजाइन का अनुकरण करना काफी सरल है:
immutable MyRational{T}
num::T
den::T
MyRational(n, d) = (g = gcd(n, d); new(n÷g, d÷g))
end
MyRational{T}(n::T, d::T) = MyRational{T}(n, d)
हमने एक निर्माणकर्ता को सफलतापूर्वक लागू किया है जो हमारी तर्कसंगत संख्याओं को सरल करता है:
julia> MyRational(10, 6)
MyRational{Int64}(5,3)