gpt4 book ai didi

json - Scala:Option[Boolean] 有意义吗?

转载 作者:行者123 更新时间:2023-12-04 10:38:52 26 4
gpt4 key购买 nike

所以一个 Option[Int]Option[String]或者就此而言 Option[A]结果 Some(A)None ,但是一个 Boolean不同,因为它本质上代表双重状态( true/false ),拥有 Option[Boolean] 有意义吗? ?我在 JSON 时经常遇到这种情况响应不应包含基于某些业务逻辑的 boolean 字段。

有什么想法吗?

最佳答案

可选性是与数据类型的正交问题。是的,Option[Boolean]和说的一样有意义 Option[Int] .

让我们谈谈您的特定用例。

如果业务规则说字段(比如说)isPrimeTime必须是 Boolean 类型,但它是可选的,那么您应该使用 Option[Boolean] 对其进行建模.
None在此上下文中表示缺少值,Some(true)将意味着“现在和真实”,Some(false)将意味着“存在和错误”。这也将允许您在代码中添加默认值,如下所示:

val isPrimeTime = json.getAs[Option[Boolean]]("isPrimeTime").getOrElse(false)

您可以雇用各种 Option在此类设置中出现的其他常见用例的组合器。 (我会让你的想象力发挥作用。)

如果您的域有很多这样的“三态”字段,并且如果第三个状态表示一些特定于域的想法,从上下文中不明显的东西,我强烈建议创建您自己的总和类型。即使您在技术上仍然可以使用 Option[Boolean] ,这可能不利于您的理智。这是一个例子。
sealed trait SignalValueIndication
case class Specified(value: Boolean) extends SignalValueIndication
case object DontCare extends SignalValueIndication

// Use
val signalValue = signalValueIndication match {
case Specified(value) => value
case DontCare => chooseOptimalSignalValueForImpl
}

这似乎是一个巨大的浪费,因为您正在失去 Option 上可用的组合器。 .这是部分正确的。部分原因是因为这两种类型是同构的,所以写桥不会那么难。
sealed trait SignalValueIndication {
// ...
def toOption: Option[Boolean] = this match {
case Specified(value) => Some(value)
case DontCare => None
}

def getOrElse(fallback: => Boolean) = this.toOption.getOrElse(fallback)
}

object SignalValueIndication {
def fromOption(value: Option[Boolean]): SignalValueIndication = {
value.map(Specified).getOrElse(DontCare)
}
}

这仍然是重要的重复,您必须根据具体情况判断增加的清晰度是否可以弥补。

HaskellTips 最近在 twitter 上提出了类似的建议,随后也进行了类似的讨论。你可以找到它 here .

有时字段的存在与否是您可以编码到数据结构中的决定。使用 Option在这种情况下是错误的。

这是一个例子。想象有一个字段 differentiator允许以下两种值。
// #1
{ "type": "lov", "value": "somethingFromSomeFixedSet" },

// #2
{ "type": "text", "value": "foo", "translatable": false }

在这里,假设 translatable字段是强制性的,但仅限于`"type": "text"。

你可以用 Option 来建模因此:
case class Differentiator(
_type: DifferentiatorType,
value: String,
translatable: Option[Boolean]
)

然而,更好的建模方法是:
sealed trait Differentiator
case class Lov(value: String) extends Differentiator
case class Text(value: String, translatable: Boolean) extends Differentiator

亚伦·明斯基的 Effective ML谈话有一个关于这个的部分。您可能会发现它很有帮助。 (虽然他使用 ML 来说明要点,但这个演讲很容易理解,也适用于 Scala 程序员)。

关于json - Scala:Option[Boolean] 有意义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24268388/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com