科学计算语言Julia及MWORKS实践 课件 14-类型系统_第1页
科学计算语言Julia及MWORKS实践 课件 14-类型系统_第2页
科学计算语言Julia及MWORKS实践 课件 14-类型系统_第3页
科学计算语言Julia及MWORKS实践 课件 14-类型系统_第4页
科学计算语言Julia及MWORKS实践 课件 14-类型系统_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

四、Julia语言进阶4.2类型系统定义:在程序运行中,将编程语言中数据的值和表达式按照一定的规则归为不同的类型,这种规则被称为类型系统。静态类型系统:值和表达式的类型先声明后使用,程序未运行就可以确定计算值和表达式的类型,减少程序运行时间,提升计算效率。动态类型系统:值和表达式的类型不用声明,编程更简单,提升开发程序的效率。Julia是一种动态类型语言,但是它可以像静态类型语言一样声明值和表达式的类型,同时具备便于程序开发和代码计算高效的优点。四、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类型系统包括抽象类型、原始类型、复合类型和参数类型。参数类型参数抽象类型参数原始类型参数复合类型抽象类型原始类型复合类型参数化四、Julia语言进阶4.2.2抽象类型声明c为一个抽象类型,d是c的一个子类型。abstracttypenameendabstracttypechlidname<:parentnameendabstracttypecendabstracttyped<:c

end抽象类型不能被实例化,只能声明是父类型的一个子类型。通常用符号<:和关键词abstracttype声明抽象类型,声明语句形式如下:断言是否为子类型julia>Number<:Realfalsejulia>Real<:Numbertrue四、Julia语言进阶4.2.2抽象类型每个抽象类型是类型图上的某个节点。任何类型都是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复合类型可变复合类型的字段不可区分时,字段值修改后相等也可区分。CC1和CC2的均由mychangecomp定义,字段均包含s1、s2和s3。字段类型相等,即不可区分。修改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参数类型协变类型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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论