Лучший способ подражать Scala Вариант [T] в Джулии? - PullRequest
2 голосов
/ 05 апреля 2020

Если вы думаете, что Scala Опция [T] весьма полезна для обработки некоторых исключений, поэтому я хотел бы использовать эту концепцию и в Юлии.

Например, если мы напишем следующее Scala код в Julia,

def div(x: Double, y: Double): Option[Double] = {
  if (y == 0.0) None else Some(x / y)
}

Я полагаю, что следующий код сделает эту работу, но есть ли лучший способ сделать это?

function div(x:: Float64, y:: Float64):: Array{Union{Float64, Missing}}
  if (y == 0.0)
   [missing]
  else
   [x / y]
  end
end

1 Ответ

2 голосов
/ 05 апреля 2020

В Юлии Union - это всего лишь объединение без тега , что немного меняет дело.

В вашем случае missing может быть очень идиоматическим решением c, в зависимости от приложения - цель missing - распространяться через следующие операции, например цепочку map в Scala:

div(1.0, 0) + 1 === missing

можно сравнить с

div(1.0, 0).map(_ + 1) == None

Но учтите, что это происходит автоматически, пока вы не нажмете какую-то функцию, которая не знает missing. (Обратите внимание, что даже x == missing оценивается как missing!) Подумайте о распространении null.

Другой вариант, который немного больше похож на Option[T], это Union{Some{T}, Nothing}. Этот тип заставит вас явно позаботиться о том, чтобы обработать оба случая: Some необходимо развернуть, а nothing не будет распространено и скоро произойдет ошибка. Это также имеет несколько другую семантику: missing больше похоже на значение N/A в обработке данных, в то время как Some / nothing приближается к Option для вещей, которые могут существовать или не существовать (например, голова возможно пустого списка).

Обратите внимание, что часто используется только Union{T, Nothing}. Это в большинстве случаев не делает различий в семантике и проще в обращении: из-за отсутствия тега Union значения T <: Union{T, Nothing} и значения ведут себя как обычные T. Но если вам нужно отличить guish a nothing с семантикой None от nothing с семантикой T, что может происходить в обобщенных функциях c, вам необходим дополнительный слой Some чтобы получить Some(nothing) и nothing.

...