【问题标题】:Subtypes of Julia concrete typesJulia 具体类型的子类型
【发布时间】:2016-07-08 12:36:18
【问题描述】:

为了练习 Julia,我正在使用迭代器接口实现一个包含一些固定步长 ODE 求解器(Euler、Runge Kutta、Bulirsch Stoer)的小模块。

我的想法是使用多次调度将函数 next 的正确方法应用于特定的迭代器,但是 Euler 和 Runge Kutta 迭代器类型(实际上是 immutable)旧的数据相同。

所以我必须选择:

  1. 创建两个相同的immutable类型,除了名称或
  2. 用一个额外的字段(比如solving_method)创建一个唯一的immutable,并使用分支而不是多个调度来解决这个问题

这两种选择对我来说都显得笨拙(尤其是第二种,因为每次迭代都会检查 solving_method 字段)。

阅读有关 Julia 继承的在线讨论后,我了解到 Julia 没有(也永远不会有)具体类型的子类型,这意味着不能“向父类型添加字段”大大地。

但是为什么我不能仅仅为了调度目的而拥有具体类型的子类型呢?

【问题讨论】:

    标签: julia


    【解决方案1】:

    解决这种问题的一种惯用方法是创建一个存储参数或求解器状态的类型,然后使用第二个不可变对象来指定方法:

    type SolverOptions
        # ... step size, error tol, etc.
    end
    
    immutable RungeKutta end
    
    immutable Euler end
    
    function solve(problem::ODE, method::RungeKutta, options::SolverOptions)
        # ... code here ...
    end
    
    function solve(problem::ODE, method::Euler, options::SolverOptions)
        # ... code here ...
    end
    

    当然,如果您想在其中存储一些数据,RungeKutta 和 Euler 不必为空。这并不总是最好的解决方案(我不能确定它是否适用于您的特定情况),但当您试图防止字段名重复时,它会有所帮助。

    【讨论】:

      【解决方案2】:

      也许试试参数类型?

      abstract OdeType
      abstract Euler <: OdeType
      abstract RK4 <: OdeType
      
      immutable Common{T<:OdeType}
          x::Int
      end
      

      【讨论】:

        猜你喜欢
        • 2017-09-03
        • 1970-01-01
        • 2016-11-05
        • 1970-01-01
        • 1970-01-01
        • 2016-10-03
        • 1970-01-01
        • 1970-01-01
        • 2018-09-20
        相关资源
        最近更新 更多