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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

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

returna

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

returna

endForth_2_1_function(genericfunctionwith1method)julia>b=Forth_2_1_function(1.0)1整型函數(shù)浮點(diǎn)型輸入值整型返回值。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語言進(jìn)階4.2.1類型聲明使用local關(guān)鍵詞修改函數(shù)的變量類型,但不能改變函數(shù)返回值的類型。浮點(diǎn)型返回值浮點(diǎn)型變量修改為整型變量四、Julia語言進(jìn)階4.2.1類型聲明Julia類型系統(tǒng)包括抽象類型、原始類型、復(fù)合類型和參數(shù)類型。參數(shù)類型參數(shù)抽象類型參數(shù)原始類型參數(shù)復(fù)合類型抽象類型原始類型復(fù)合類型參數(shù)化四、Julia語言進(jìn)階4.2.2抽象類型聲明c為一個抽象類型,d是c的一個子類型。abstracttypenameendabstracttypechlidname<:parentnameendabstracttypecendabstracttyped<:c

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

endabstracttypeAbstractFloat<:Real

endabstracttypeInteger<:Real

endabstracttypeSigned<:Integer

endabstracttypeUnsigned<:Integer

endAnyNumberRealAbstractFloatIntegerSignedUnsigned四、Julia語言進(jìn)階4.2.2抽象類型抽象類型通常被應(yīng)用于函數(shù)輸入?yún)?shù)的聲明function

Forth_2_2_2(a,b)

c=a-b;

returncendfunction

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

c=a-b;

returncend未聲明函數(shù)變量的類型時,默認(rèn)變量的類型為Any。Forth_2_2_2(a,b)與Forth_2_2_2(a::Any,b::Any)等價。四、Julia語言進(jìn)階4.2.2抽象類型位于類型圖最低點(diǎn)的抽象類型,稱為Union{}類型,又稱類型共用體。關(guān)鍵詞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語言進(jìn)階4.2.3原始類型原始類型是具體類型,它的數(shù)據(jù)是由位組成。用關(guān)鍵詞primitivetype聲明原始類型,聲明語法如下:primitivetypenamebitsendprimitivetypechildname<:parentname

bits

end子類型名稱父類型名稱聲明類型占用的內(nèi)存空間四、Julia語言進(jìn)階4.2.3原始類型常見的原始類型有整數(shù)類型、浮點(diǎn)數(shù)類型、Bool類型和Char類型。Julia已經(jīng)給用戶定義了這些標(biāo)準(zhǔn)原始類型。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語言進(jìn)階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函數(shù)的輸入變量為原始類型時,函數(shù)可對抽象類型數(shù)據(jù)重新編譯。julia>isprimitivetype(Int)truejulia>isprimitivetype(Real)false內(nèi)置函數(shù)isprimitivetype()判斷類型是否為原始類型四、Julia語言進(jìn)階4.2.4復(fù)合類型復(fù)合類型是用戶唯一可以定義的類型,它是命名字段的集合。用戶可定義包含兩種及其以上的新類型,用關(guān)鍵詞struct定義不可變復(fù)合類型。julia>structmycomps1s2::Ints3::Float64

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

typeof(newcomp)mycomp定義名為mycomp的復(fù)合類型,包含Any/類型變量s1,整型變量s2和浮點(diǎn)型變量s3。輸入mycomp的對應(yīng)字段的變量值。四、Julia語言進(jìn)階4.2.4復(fù)合類型在Syslab中,與復(fù)合類型相關(guān)的內(nèi)置函數(shù)。julia>

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

fieldtypes(mycomp)#確定復(fù)合類型中所有聲明的類型(Any,Int64,Float64)julia>fieldtype(mycomp,:s2)#確定復(fù)合類型中指定字段聲明的類型Int64julia>fieldtype(mycomp,3)#確定復(fù)合類型中第3個字段聲明的類型Float64四、Julia語言進(jìn)階4.2.4復(fù)合類型用field語法訪問復(fù)合類型指定字段的值julia>newcomp.s1"Syslab"julia>newcomp.s2100julia>newcomp.s3100.0julia>mycomp.s2=3ERROR:setfield!fieldsofTypesshouldnotbechanged不可變復(fù)合類型不支持修改字段的值。訪問newcomp的s1和s2和s3值。四、Julia語言進(jìn)階4.2.4復(fù)合類型若不可變復(fù)合類型中不包含任何字段,稱為單例類型。用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語言進(jìn)階4.2.4復(fù)合類型關(guān)鍵詞mutablestruct聲明的可變復(fù)合類型。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的可變復(fù)合類型修改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語言進(jìn)階4.2.4復(fù)合類型可變復(fù)合類型的字段不可區(qū)分時,字段值修改后相等也可區(qū)分。CC1和CC2的均由mychangecomp定義,字段均包含s1、s2和s3。字段類型相等,即不可區(qū)分。修改s3的值四、Julia語言進(jìn)階4.2.5參數(shù)類型T表示Para_comp的類型,它可以是任何類型。類型可以被參數(shù)化,每一個參數(shù)值的可能組合引入一個新類型,包含參數(shù)復(fù)合類型、參數(shù)抽象類型和參數(shù)原始類型。julia>structPara_comp{T}x::Ty::T

endjulia>Para_comp{Int64}Para_comp{Int64}julia>Para_comp{Float64}Para_comp{Float64}參數(shù)復(fù)合類型聲明語法:Para_comp{T}包含了無數(shù)個類型。當(dāng)它被調(diào)用時才會確定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語言進(jìn)階4.2.5參數(shù)類型參數(shù)復(fù)合類型的具體類型是它的一個子類型參數(shù)復(fù)合類型、它的具體類型和花括號中類型的關(guān)系?;ɡㄌ栔械念愋筒皇菂?shù)復(fù)合類型的子類型參數(shù)復(fù)合類型的具體類型之間不存在父類型和子類型關(guān)系。julia>Int64<:Realtruejulia>Para_comp{Int64}<:Para_comp{Real}false花括號中的類型存在子類型關(guān)系,具體類型之間也不存在父類型和子類型關(guān)系。julia>

abstracttypePara_abst{T}endjulia>Para_abst{Float64}<:Para_absttruejulia>Para_abst{1.7}<:Para_absttrue四、Julia語言進(jìn)階4.2.5參數(shù)類型參數(shù)抽象類型的具體類型是它的一個子類型。參數(shù)抽象類型聲明語法:abstracttypename{T}endjulia>Para_abst{Float64}<:Para_abst{Real}falsejulia>Para_abst{Real}<:Para_abst{Float64}false參數(shù)抽象類型的具體類型之間不存在父類型和子類型關(guān)系。四、Julia語言進(jìn)階4.2.5參數(shù)類型協(xié)變類型Para_abst{<:Real}和逆變類型Para_abst{>:Int}表示類型的集合,可以作為參數(shù)抽象類型實例的父類型。julia>Para_abst{Int}<:Para_abst{<:Real}truejulia>Para_abst{Real}<:Para_abst{>:Int}true四、Julia語言進(jìn)階4.2.5參數(shù)類型參數(shù)復(fù)合類型可以聲明為參數(shù)抽象類型的子類型。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參數(shù)抽象類型的具體類型與參數(shù)復(fù)合類型的具體類型不存在父類型和子類型關(guān)系。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語言進(jìn)階4.2.5參數(shù)類型聲明為參數(shù)抽象類型時可約束類型的范圍。約束T的為Real的子類型四、Julia語言進(jìn)階4.2.5參數(shù)類型參數(shù)原始類型的聲明語法: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}是一個抽象的參數(shù)類型,它的實例是唯一的;如果沒有參數(shù)T,那么Tpye是抽象類型,則任何類型都是它的具體了。四、Julia語言進(jìn)階4.2.5參數(shù)類型未實例化的參數(shù)類型,稱為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語言進(jìn)階4.2.5參數(shù)類型有多個字段可用多個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語言進(jìn)階4.2.6類型運(yùn)算類型運(yùn)算包括檢測對象的類型,判斷類型的子類型和父類型,判斷類型的類型。julia>

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

typeof(Int64)

溫馨提示

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

最新文檔

評論

0/150

提交評論