我有一个副作用函数,它会改变类变量,或者如果不符合前提条件则抛出异常。在添加到类级别可变映射后,我想返回一个" boolean"从表示成功的功能。所以下面就是我在考虑的问题,但是将布尔值硬编码为" true"但是当它进入yield block时会感觉不合适,否则析取的左侧将填充异常。
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 }
}
}
其中&#39;键&#39;和#&#39;价值观&#39;是&#39; val&#39; ConcurrentHashMap的实例。所以每次都要添加&#39;成功的右侧分离将永远是&#34;真正的&#34;意思是布尔值将从不为假。这看起来合适吗?
答案 0 :(得分:2)
当副作用方法没有有意义的返回值时,通常会返回Unit
。如果你想捕捉到失败的可能性,那么返回Throwable \/ Unit
是完全合理的,这可能就是我在这里所做的。在任何情况下,我都会说你的直觉认为返回一个Throwable \/ Boolean
是一个坏主意,而true
除了{{1}}之外,其他地方永远都不可能。
答案 1 :(得分:1)
看起来很傻。如果成功,可以减少到Option[Throwable]
- None
,如果不成功,则可以减少到例外。唯一不利于它的是None
通常与成功无关。
作为替代方案,根据Success
和Failure(throwable)
编写您自己的monad monad。