关于Function和参数类型的一个疑惑


#1

昨天遇到个问题没想通:

julia> struct X{T<:Union{Float64,Function}}
       a::T
       end

julia> a = X(1.)
X{Float64}(1.0)

julia> b = X(identity)
X{typeof(identity)}(identity)

julia> a isa X{Float64}
true

julia> b isa X{Function}
false

julia> identity isa Function
true

这里为什么 b isa X{Function}false


注:
在参数类型的文档中 http://docs.juliacn.com/latest/manual/types/#Parametric-Composite-Types-1 有提到某个类型中参数的继承关系并不能被外层的类型继承,即:

This last point is very important: even though Float64 <: Real we DO NOT have Point{Float64} <: Point{Real} .

但是,这里的问题在于,b的类型应该是excatly equal to X{Function}才对?

julia> typeof(a)
X{Float64}

julia> typeof(a) == X{Float64}
true

julia> typeof(b)
X{typeof(identity)}

julia> typeof(b) == X{Function}
false

注注:

目前我折中的做法是,在multiple dispatch的时候,声明参数的类型是f(x::X{<:Function}):

b isa X{<:Function}
true

#2

根据群里 @Roger 的解答,我之前对Function一直有误解,以为是concrete type。

这里identity函数是Function的子类:

julia> supertype(typeof(identity))
Function

#3

嗯,因为每个函数都有自己的类型。