科學計算語言Julia及MWORKS實踐 課件 14-類型系統(tǒng)_第1頁
科學計算語言Julia及MWORKS實踐 課件 14-類型系統(tǒng)_第2頁
科學計算語言Julia及MWORKS實踐 課件 14-類型系統(tǒng)_第3頁
科學計算語言Julia及MWORKS實踐 課件 14-類型系統(tǒng)_第4頁
科學計算語言Julia及MWORKS實踐 課件 14-類型系統(tǒng)_第5頁
已閱讀5頁,還剩27頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

四、Julia語言進階4.2類型系統(tǒng)定義:在程序運行中,將編程語言中數據的值和表達式按照一定的規(guī)則歸為不同的類型,這種規(guī)則被稱為類型系統(tǒng)。靜態(tài)類型系統(tǒng):值和表達式的類型先聲明后使用,程序未運行就可以確定計算值和表達式的類型,減少程序運行時間,提升計算效率。動態(tài)類型系統(tǒng):值和表達式的類型不用聲明,編程更簡單,提升開發(fā)程序的效率。Julia是一種動態(tài)類型語言,但是它可以像靜態(tài)類型語言一樣聲明值和表達式的類型,同時具備便于程序開發(fā)和代碼計算高效的優(yōu)點。四、Julia語言進階4.2.1類型聲明斷言語法:變量和表達式::類型名稱,例如類型聲明,或稱類型注釋,用運算符“::”斷言和聲明變量和表達式的類型。julia>(0.5*0.6)::Int64ERROR:TypeError:intypeassert,expectedInt64,gotavalueoftypeFloat64Stacktrace:[1]top-levelscope@REPL[4]:1julia>(0.5*0.6)::Float640.3斷言非真,報錯。斷言為真,輸出表達式的值。四、Julia語言進階4.2.1類型聲明聲明語法:變量和表達式名稱::類型名稱,例如聲明浮點型變量ajulia>functionForth_2_1_function()a::Float64=1.0;

returna

endForth_2_1_function(genericfunctionwith1method)julia>b=Forth_2_1_function()1.0julia>typeof(b)Float64julia>運算符::不支持聲明全局變量,僅可聲明局部變量。Typeof函數輸出變量的類型。四、Julia語言進階4.2.1類型聲明聲明函數的類型:函數名稱()::類型名稱,例如聲明整型函數julia>functionForth_2_1_function()::Int64a::Float64=1.0;

returna

endForth_2_1_function(genericfunctionwith1method)julia>b=Forth_2_1_function()1整型函數的輸出值為整型聲明函數的類型為整型四、Julia語言進階4.2.1類型聲明已聲明類型的函數,返回值類型與輸入值的類型無關。julia>functionForth_2_1_function(a::Float64)::Int64

returna

endForth_2_1_function(genericfunctionwith1method)julia>b=Forth_2_1_function(1.0)1整型函數浮點型輸入值整型返回值。julia>functionForth_2_1_function()a::Float64=1.0;

returna

endForth_2_1_function(genericfunctionwith1method)julia>locala::Int64=11julia>b=Forth_2_1_function()1.0四、Julia語言進階4.2.1類型聲明使用local關鍵詞修改函數的變量類型,但不能改變函數返回值的類型。浮點型返回值浮點型變量修改為整型變量四、Julia語言進階4.2.1類型聲明Julia類型系統(tǒng)包括抽象類型、原始類型、復合類型和參數類型。參數類型參數抽象類型參數原始類型參數復合類型抽象類型原始類型復合類型參數化四、Julia語言進階4.2.2抽象類型聲明c為一個抽象類型,d是c的一個子類型。abstracttypenameendabstracttypechlidname<:parentnameendabstracttypecendabstracttyped<:c

end抽象類型不能被實例化,只能聲明是父類型的一個子類型。通常用符號<:和關鍵詞abstracttype聲明抽象類型,聲明語句形式如下:斷言是否為子類型julia>Number<:Realfalsejulia>Real<:Numbertrue四、Julia語言進階4.2.2抽象類型每個抽象類型是類型圖上的某個節(jié)點。任何類型都是Any的子類型,任何對象都是Any的實例。abstracttypeNumberendabstracttypeReal<:Number

endabstracttypeAbstractFloat<:Real

endabstracttypeInteger<:Real

endabstracttypeSigned<:Integer

endabstracttypeUnsigned<:Integer

endAnyNumberRealAbstractFloatIntegerSignedUnsigned四、Julia語言進階4.2.2抽象類型抽象類型通常被應用于函數輸入參數的聲明function

Forth_2_2_2(a,b)

c=a-b;

returncendfunction

Forth_2_2_2(a::Any,b::Any)

c=a-b;

returncend未聲明函數變量的類型時,默認變量的類型為Any。Forth_2_2_2(a,b)與Forth_2_2_2(a::Any,b::Any)等價。四、Julia語言進階4.2.2抽象類型位于類型圖最低點的抽象類型,稱為Union{}類型,又稱類型共用體。關鍵詞Union定義類型共用體。julia>myunion=Union{Int,Float64,AbstractString}#定義類型集合myunionUnion{Float64,Int64,AbstractString}julia>1::myunion#斷言1julia>

1.0::myunion#斷言1.0julia>"Syslab"::myunion"Syslab"注意:所有類型都是Union{}類型的父類型,它不能被實例化四、Julia語言進階4.2.3原始類型原始類型是具體類型,它的數據是由位組成。用關鍵詞primitivetype聲明原始類型,聲明語法如下:primitivetypenamebitsendprimitivetypechildname<:parentname

bits

end子類型名稱父類型名稱聲明類型占用的內存空間四、Julia語言進階4.2.3原始類型常見的原始類型有整數類型、浮點數類型、Bool類型和Char類型。Julia已經給用戶定義了這些標準原始類型。primitivetypeFloat16<:AbstractFloat

16

endprimitivetypeFloat32<:AbstractFloat

32

endprimitivetypeFloat64<:AbstractFloat

64

endprimitivetypeBool<:Integer

8

endprimitivetypeChar<:AbstractChar

32

endprimitivetypeInt8<:Signed

8

endprimitivetypeUInt8<:Unsigned

8

endprimitivetypeInt16<:Signed

16

endprimitivetypeUInt16<:Unsigned

16

endprimitivetypeInt32<:Signed

32

endprimitivetypeUInt32<:Unsigned

32

endprimitivetypeInt64<:Signed

64

endprimitivetypeUInt64<:Unsigned

64

endprimitivetypeInt128<:Signed

128

endprimitivetypeUInt128<:Unsigned

128

end四、Julia語言進階4.2.3原始類型julia>functionForth_2_2_4(a::Integer)::Integer

returna

endForth_2_2_4(genericfunctionwith1method)julia>c=Forth_2_2_4(5)5julia>typeof(c)Int64函數的輸入變量為原始類型時,函數可對抽象類型數據重新編譯。julia>isprimitivetype(Int)truejulia>isprimitivetype(Real)false內置函數isprimitivetype()判斷類型是否為原始類型四、Julia語言進階4.2.4復合類型復合類型是用戶唯一可以定義的類型,它是命名字段的集合。用戶可定義包含兩種及其以上的新類型,用關鍵詞struct定義不可變復合類型。julia>structmycomps1s2::Ints3::Float64

endjulia>newcomp=mycomp("Syslab",100,100.0)mycomp("Syslab",100,100.0)julia>

typeof(newcomp)mycomp定義名為mycomp的復合類型,包含Any/類型變量s1,整型變量s2和浮點型變量s3。輸入mycomp的對應字段的變量值。四、Julia語言進階4.2.4復合類型在Syslab中,與復合類型相關的內置函數。julia>

fieldnames(mycomp)#導出字段名稱(:s1,:s2,:s3)julia>fieldcount(mycomp)#確定復合類型中所有聲明的類型的數量3julia>

fieldtypes(mycomp)#確定復合類型中所有聲明的類型(Any,Int64,Float64)julia>fieldtype(mycomp,:s2)#確定復合類型中指定字段聲明的類型Int64julia>fieldtype(mycomp,3)#確定復合類型中第3個字段聲明的類型Float64四、Julia語言進階4.2.4復合類型用field語法訪問復合類型指定字段的值julia>newcomp.s1"Syslab"julia>newcomp.s2100julia>newcomp.s3100.0julia>mycomp.s2=3ERROR:setfield!fieldsofTypesshouldnotbechanged不可變復合類型不支持修改字段的值。訪問newcomp的s1和s2和s3值。四、Julia語言進階4.2.4復合類型若不可變復合類型中不包含任何字段,稱為單例類型。用sturct定義單例類型julia>

structsingletype

endjulia>Base.issingletontype(singletype)truejulia>a=singletype()singletype()julia>b=singletype()singletype()julia>aisasingletypetruejulia>

isa(b,singletype)truejulia>a===btrue用Base.issingletontype判斷是否為單例類型判斷a是否為singletype類型判斷a和b的類型和值是否都一致四、Julia語言進階4.2.4復合類型關鍵詞mutablestruct聲明的可變復合類型。julia>

mutablestructmychangedcomps1s2::Ints3::Float64

end

julia>myCC=mychangedcomp("MWORKS",2023,1.0)mychangedcomp("MWORKS",2023,1.0)julia>myCC.s1="Syslab""Syslab"julia>myCC.s3=2.02.0定義名為mychangedcomp的可變復合類型修改s1和s2的值julia>CC1=mychangedcomp("MWORKS",2023,1.0)mychangedcomp("MWORKS",2023,1.0)julia>CC2=mychangedcomp("MWORKS",2023,2.0)mychangedcomp("MWORKS",2023,2.0)julia>CC1.s3=2.02.0julia>CC1===CC2false四、Julia語言進階4.2.4復合類型可變復合類型的字段不可區(qū)分時,字段值修改后相等也可區(qū)分。CC1和CC2的均由mychangecomp定義,字段均包含s1、s2和s3。字段類型相等,即不可區(qū)分。修改s3的值四、Julia語言進階4.2.5參數類型T表示Para_comp的類型,它可以是任何類型。類型可以被參數化,每一個參數值的可能組合引入一個新類型,包含參數復合類型、參數抽象類型和參數原始類型。julia>structPara_comp{T}x::Ty::T

endjulia>Para_comp{Int64}Para_comp{Int64}julia>Para_comp{Float64}Para_comp{Float64}參數復合類型聲明語法:Para_comp{T}包含了無數個類型。當它被調用時才會確定T的具體類型。julia>Para_comp{Int64}<:Para_comptruejulia>Int64<:Para_compfalsejulia>Para_comp{Int64}<:Para_comp{Float64}falsejulia>Para_comp{Float64}<:Para_comp{Int64}false四、Julia語言進階4.2.5參數類型參數復合類型的具體類型是它的一個子類型參數復合類型、它的具體類型和花括號中類型的關系。花括號中的類型不是參數復合類型的子類型參數復合類型的具體類型之間不存在父類型和子類型關系。julia>Int64<:Realtruejulia>Para_comp{Int64}<:Para_comp{Real}false花括號中的類型存在子類型關系,具體類型之間也不存在父類型和子類型關系。julia>

abstracttypePara_abst{T}endjulia>Para_abst{Float64}<:Para_absttruejulia>Para_abst{1.7}<:Para_absttrue四、Julia語言進階4.2.5參數類型參數抽象類型的具體類型是它的一個子類型。參數抽象類型聲明語法:abstracttypename{T}endjulia>Para_abst{Float64}<:Para_abst{Real}falsejulia>Para_abst{Real}<:Para_abst{Float64}false參數抽象類型的具體類型之間不存在父類型和子類型關系。四、Julia語言進階4.2.5參數類型協(xié)變類型Para_abst{<:Real}和逆變類型Para_abst{>:Int}表示類型的集合,可以作為參數抽象類型實例的父類型。julia>Para_abst{Int}<:Para_abst{<:Real}truejulia>Para_abst{Real}<:Para_abst{>:Int}true四、Julia語言進階4.2.5參數類型參數復合類型可以聲明為參數抽象類型的子類型。julia>

structPara_comp{T}<:Para_abst{T}x::Ty::T

endjulia>Para_comp{Int}<:Para_abst{Int}truejulia>Para_comp{Int}<:Para_abst{<:Real}truejulia>Para_comp{Int}<:Para_abst{Real}false參數抽象類型的具體類型與參數復合類型的具體類型不存在父類型和子類型關系。julia>abstracttypePara_abst{T<:Real}endjulia>Para_abst{Int}Para_abst{Int64}julia>Para_abst{AbstractString}ERROR:TypeError:inPara_abst,inT,expectedT<:Real,gotType{AbstractString}julia>

structPara_comp{T<:Real}<:Para_abst{T}x::Ty::T

endjulia>Para_comp{Int}Para_comp{Int64}julia>Para_comp{AbstractString}ERROR:TypeError:inPara_comp,inT,expectedT<:Real,gotType{AbstractString}四、Julia語言進階4.2.5參數類型聲明為參數抽象類型時可約束類型的范圍。約束T的為Real的子類型四、Julia語言進階4.2.5參數類型參數原始類型的聲明語法:primitivetypeName{T}64

endjulia>primitivetypePara_prim{T}64endjulia>Para_prim{Int}<:Para_primtruejulia>isa(Int,Type{Int})truejulia>isa(Int,Type{Real})falsejulia>isa(Int,Type)truejulia>isa(1,Type)falseType{T}是一個抽象的參數類型,它的實例是唯一的;如果沒有參數T,那么Tpye是抽象類型,則任何類型都是它的具體了。四、Julia語言進階4.2.5參數類型未實例化的參數類型,稱為UnionAll類型,用字段where約束類型范圍。julia>

structPara_comp{T}x::Ty::T

endjulia>

functionmyunionall1(a::Para_comp{T}whereT<:Real)#限定使用Real的子類型

a

endmyunionall1(genericfunctionwith1method)julia>

functionmyunionall2(b::Para_comp{T}whereInt64<:T<:Real) #限定用Int64與Real的之間的類型b

endmyunionall2(genericfunctionwith1method)四、Julia語言進階4.2.5參數類型有多個字段可用多個where限定類型范圍,用空格隔開。例如,限定T1和T2的類型范圍:julia>

structPara_comp_2{T1,T2}x::T1y::T2

endjulia>

functionmyunionall3(c::Para_comp_2{T1,T2}where{T1<:Real}where{T2<:Int64})c

endmyunionall3(genericfunctionwith1method)julia>四、Julia語言進階4.2.6類型運算類型運算包括檢測對象的類型,判斷類型的子類型和父類型,判斷類型的類型。julia>

isa(1.0,Float64)#檢測對象是否為浮點型truejulia>typeof(2)#檢測對象的類型Int64julia>

typeof(Int64)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論