就看single parametric的情况即可.
struct Ty{T} end
concrete = Ty{Int}
是否有这样一个函数some_fn
能够得到如下关系
Ty === some_fn(concrete) # => true
反过来的话, 鉴于没有类型约束时可选concrete type无穷多, 而Ty.var本身也以归纳方式描述了forall T match [Ty.var.lb] < T < [Ty.var.ub]. Ty{T}
, 所以从UnionAll到Concrete这个方向就很清楚了.
所以只要有从Concrete导出UnionAll的方法就好了.
是想要类似typejoin
和typeintersect
这种函数么?
julia> typeintersect(Ty, concrete)
Ty{Int64}
julia> typejoin(Ty, concrete)
Ty
1 个赞
thx! typejoin
works well. 要是有它的码源就更好了…
在REPL里@less typejoin(Ty, concrete)
就可以查看,或者@edit
在编辑器中打开,如果配置了JULIA_EDITOR
环境变量。
1 个赞
再次感谢.
请问是否有直接从concrete到Ty的函数或者宏?
julia> struct Ty{T} end
julia> concrete = Ty{Int}
Ty{Int64}
julia> concrete.name
Ty
这个方向我说了是平凡的啊。如何从Ty{Int64} → Ty{T}才是关键。。
julia> eval(Symbol(concrete.name)) === Ty{T} where T
true
大概?
请注意,我现在只有一个对象t, 其值是Ty{Int64}
我想解构它拿到其中的Ty和Int64, 其中拿到Int64是简单的,拿parameters属性就行。主要是拿Ty
base_ty = get_base(t)
Scheme
11
请原谅我的愚钝。。。并没明白你的意思。。。 base_ty
的值不是 Ty{T} where T
吗?
julia> (Ty{T} where T) === Ty
true
Scheme
12
julia> struct Ty{T} end
julia> t = Ty{Int}
Ty{Int64}
julia> Base.@pure get_base(t) = t.name.wrapper.body
get_base (generic function with 1 method)
julia> get_base(t)
Ty{T}
julia> Base.@pure get_base2(t) = t.name.wrapper
get_base2 (generic function with 1 method)
julia> get_base2(t)
Ty
julia> typeof(ans)
UnionAll
emmm,我尽力了。GG
2 个赞