Как указать условия в составных типах Юлии? - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь создать составной тип в Юлии, представляющий точки на эллиптической кривой.Точка действительна, если удовлетворяет y ^ 2 == x ^ 3 + a * x + b ИЛИ и x, и y равны нулю.Обратите внимание, что последний случай представляет точку на бесконечности.

Я пришел с приведенным ниже кодом, но не могу понять, как учитывать точку на бесконечности.

  • Есть лиспособ обработки различных исключений в структуре?
  • Может ли исключение просто вернуть допустимый тип вместо ошибки?например, если x == ничто && y == ничто, то точка (ничто, ничто, a, b)

</p>

<code>IntOrNothing = Union{Int,Nothing}
struct Point
    x::IntOrNothing
    y::IntOrNothing
    a::Int
    b::Int
    Point(x,y,a,b) = x == nothing || y == nothing || y^2 != x^3 + a*x + b ? error("Point is not on curve") : new(x,y,a,b)
end
</code>

1 Ответ

0 голосов
/ 12 октября 2018

Я бы определил два внутренних конструктора для Point следующим образом:

IntOrNothing = Union{Int,Nothing}
struct Point
    x::IntOrNothing
    y::IntOrNothing
    a::Int
    b::Int
    Point(x::Nothing,y::Nothing,a,b) = new(x,y,a,b)
    Point(x,y,a,b) = y^2 != x^3 + a*x + b ? error("Point is not on curve") : new(x,y,a,b)
end

, так как это было бы наиболее читабельным, на мой взгляд.

Обратите внимание, что вы получите MethodError, еслиВы звоните Point(nothing,2,1,3), но, думаю, из вашего кода вам не безразличен тип исключения, генерируемого при неверных данных.

Решает ли это вашу проблему?

...