我有一个副作用函数,它会改变类变量或在不满足先决条件时抛出异常。添加到类级别可变映射后,我想从函数返回一个"布尔值",表示成功。所以下面是我在想什么,但硬编码布尔值为"真"感觉不合适,但这将是情况下,当它进入yield块,否则左侧的分离将被一个异常填充。
def add(e: Entity, value: String): /[Throwable,Boolean] = {
checkIfFieldIsKey(e.id) match {
case Some(id) =>
val validId = validateIdType(..)
for {
k <- validId
} yield { keys += (e -> k); true }
case None =>
for {
r <- validateTypeAndValue(e, value)
} yield { values += (e -> value); true }
}
}
其中'键'和'值'是ConcurrentHashMap的'val'实例。因此,每次"add"成功时,析取的右侧总是为"真",这意味着布尔值将永远不会为假。这看起来合适吗?
当副作用方法没有有意义的返回值时,通常返回Unit
。如果您想捕获失败的可能性,返回Throwable / Unit
是完全合理的,这可能就是我在这里要做的。在任何情况下,我都会说你的直觉,这是一个坏主意,返回一个Throwable / Boolean
,右边永远不能是任何东西,但true
是正确的。
看起来很傻。如果成功,可以简化为Option[Throwable]
—None
,如果失败,则可以简化为异常。唯一反对它的是None
通常不与成功联系在一起。
作为一种替代方法,您可以编写自己的maybe monad,使用Success
和Failure(throwable)
作为案例。