Julia中的多参数递归类型与类型推理

Julia中的多参数递归类型与类型推理,julia,Julia,我已经创建了这种类型的数据结构 abstract type Node end struct Tree{A <: Node, B <: Node} <: Node a::A b::B end 但我也可以定义一个函数,比如 function test(node::Tree{Tree{Character, Character}, Tree}) end 它寻址一棵树,最左边的分支包含两个字符,右边的分支包含一棵任意的树 我的实现以类似的方式分派许多方法 这种类型的

我已经创建了这种类型的数据结构

abstract type Node end

struct Tree{A <: Node, B <: Node} <: Node
    a::A
    b::B
end
但我也可以定义一个函数,比如

function test(node::Tree{Tree{Character, Character}, Tree}) end
它寻址一棵
,最左边的分支包含两个
字符
,右边的分支包含一棵任意的

我的实现以类似的方式分派许多方法


这种类型的结构可以工作,但对于相当大的树,我注意到了一些缓慢的现象,特别是在尝试使用
typeof
确定类型时。这种模式被认为是有效的吗?如果没有,有没有办法提高效率?

根据特定场景,可能会有许多树定义的建议。但是,确实要避免导致性能低下的递归嵌套类型结构

这是我的建议。此二叉树可以保存类型为
T

struct Tree{T}
    val::T
    a::Union{Tree{T}, Nothing}
    b::Union{Tree{T}, Nothing}
end

Tree(val::A) where A=Tree{A}(val,nothing,nothing)

leaf1 = Tree(4)
leaf2 = Tree(5)
subb1 = Tree(555,leaf1,leaf2)
tree = Tree(1000,subb1, Tree(888))
现在让我们看看那棵树:

juila> dump(tree)
Tree{Int64}
  val: Int64 1000
  a: Tree{Int64}
    val: Int64 555
    a: Tree{Int64}
      val: Int64 4
      a: Nothing nothing
      b: Nothing nothing
    b: Tree{Int64}
      val: Int64 5
      a: Nothing nothing
      b: Nothing nothing
  b: Tree{Int64}
    val: Int64 888
    a: Nothing nothing
    b: Nothing nothing

“按类型寻址节点”是什么意思?您能添加您的实现和您实际测量的内容吗?编辑后,我无法添加实现的各个部分,因为这会混淆问题的范围,因此我添加了两个示例。我只对递归类型的这种特定方法可能效率低下感兴趣。哦,你添加的东西一点也不令人困惑,这是一个很好的问题。你是怎么打发时间的?我怀疑,由于编译的原因,您测量的效果仅在第一次调用该函数时出现;在那之后,它应该是相当快的。尝试BenchmarkTools。BenchmarkTools报告所有函数的最大时间较高,最小时间、中值和平均时间较低。最长时间总是在第一次运行时注册的,问题是,每当我以类似于我所展示的方式更改一个函数的输入参数时,它似乎总是报告更高的值。这可能是因为更改树的结构会更改类型本身的结构,编译器会尝试对其上的函数进行优化。唯一的问题是,我想不出任何真正的替代方法能像我为
test
编写方法那样方便。有没有一种方法可以使用与此类似的方法,并在我的示例
test
函数中类似地分派方法?没有,因为这假定存储的数据具有同质性。现在再看看您的问题,您将查找类似于
staticarray
但面向树的内容。
StaticArrays
的问题是,对于具有5个或10个元素的数组来说,它的速度非常快,而对于具有几百个元素的数组来说,由于编译时间的原因,它是不可用的。既然你想拥有大树,我认为你应该详细阐述你想要实现的目标,而不是如何实现,也许比提出另一个解决方案更重要。
struct Tree{T}
    val::T
    a::Union{Tree{T}, Nothing}
    b::Union{Tree{T}, Nothing}
end

Tree(val::A) where A=Tree{A}(val,nothing,nothing)

leaf1 = Tree(4)
leaf2 = Tree(5)
subb1 = Tree(555,leaf1,leaf2)
tree = Tree(1000,subb1, Tree(888))
juila> dump(tree)
Tree{Int64}
  val: Int64 1000
  a: Tree{Int64}
    val: Int64 555
    a: Tree{Int64}
      val: Int64 4
      a: Nothing nothing
      b: Nothing nothing
    b: Tree{Int64}
      val: Int64 5
      a: Nothing nothing
      b: Nothing nothing
  b: Tree{Int64}
    val: Int64 888
    a: Nothing nothing
    b: Nothing nothing