2016-07-08 7 views
1

Для того, чтобы практиковать с Julia, я реализую небольшой модуль, содержащий некоторые фиксированные решатели ODE (Euler, Runge Kutta, Bulirsch Stoer) с использованием интерфейса итератора.Подтипы конкретных типов Julia

Моя идея состояла в том, чтобы использовать множественную диспетчеризацию, чтобы применить правильный метод функции next к конкретному итератора, однако Эйлера и Рунге-Кутта типа итератора (на самом деле immutable) старые одни и те же данные.

Так что я должен выбрать между:

  1. создать два immutable типа идентичны для имени или
  2. обрешетки уникального immutable с дополнительным полем, кроме (скажет solving_method) и использовать ветвление вместо многократной отправки в обратитесь к этому выпуску

Оба варианта кажутся неуклюжими для меня (в частности, второго, потому что поле solving_method проверено на каждом итерате ион).

Чтение онлайн-дискуссии по поводу наследования в Юле я понял, что Джулия не имеет (и никогда не будет) подтипа конкретных типов, а это означает, что один не может «добавлять поля» к родительскому типу таким образом.

Но почему у меня нет подтипов конкретных типов только для отправки?

ответ

1

Возможно, попробуйте параметрические типы?

abstract OdeType 
abstract Euler <: OdeType 
abstract RK4 <: OdeType 

immutable Common{T<:OdeType} 
    x::Int 
end 
2

Один идиоматических способ решить этот аромат проблемы заключается в создании типа, которая хранит параметры или состояние решателя, а затем иметь второй непреложный указать метод:

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 не должны быть пустыми, если вы хотите сохранить некоторые данные там. Это не всегда лучшее решение (и я не могу быть уверенным, что оно будет работать в вашем конкретном случае), но оно может помочь, когда вы пытаетесь предотвратить дублирование имен полей.

Смежные вопросы