副作用函数返回析取

时间:2014-05-29 15:35:08

标签: scala

我有一个副作用函数,它会改变类变量,或者如果不符合前提条件则抛出异常。在添加到类级别可变映射后,我想返回一个" 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;意思是布尔值将从不为假。这看起来合适吗?

2 个答案:

答案 0 :(得分:2)

当副作用方法没有有意义的返回值时,通常会返回Unit。如果你想捕捉到失败的可能性,那么返回Throwable \/ Unit是完全合理的,这可能就是我在这里所做的。在任何情况下,我都会说你的直觉认为返回一个Throwable \/ Boolean是一个坏主意,而true除了{{1}}之外,其他地方永远都不可能。

答案 1 :(得分:1)

看起来很傻。如果成功,可以减少到Option[Throwable] - None,如果不成功,则可以减少到例外。唯一不利于它的是None通常与成功无关。

作为替代方案,根据SuccessFailure(throwable)编写您自己的monad monad。