【问题标题】:Best way of mimicking Scala Option[T] in Julia?在 Julia 中模仿 Scala Option[T] 的最佳方式?
【发布时间】:2020-07-17 07:42:49
【问题描述】:

如果认为 Scala Option[T] 对于处理一些异常非常有用,那么我也想在 Julia 中使用这个概念。

例如,如果我们在 Julia 中编写以下 Scala 代码,

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

【问题讨论】:

    标签: julia


    【解决方案1】:

    在 Julia 中,Union 只是一个 未标记 联合,这有点不同。

    在您的情况下,missing 可能是一个非常惯用的解决方案,具体取决于应用程序——missing 的目的是通过以下操作进行传播,就像 Scala 中的 map 链一样:

    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。但是,如果您需要区分nothingNone 语义和nothingT 语义,这可能出现在泛型函数中,您需要额外的Some 层来获取Some(nothing)nothing .

    【讨论】:

    • 感谢您的出色回答,特别是指出 x == missing 会丢失
    • 从1.3开始,还有Base.ismissing
    猜你喜欢
    • 2015-02-23
    • 2016-11-08
    • 2021-05-05
    • 2018-12-22
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 2018-10-06
    • 2015-10-09
    相关资源
    最近更新 更多