0
簡單的方法假設你有以下Either[A1,B2]
實例,其中A1
和B2
是map
版匹配Either[A,B]
,其中A
和B
有一個常見的亞型S
。有沒有辦法輕鬆縮小類型A
和B
至S
?縮小在類型上左右要麼
簡單的方法假設你有以下Either[A1,B2]
實例,其中A1
和B2
是map
版匹配Either[A,B]
,其中A
和B
有一個常見的亞型S
。有沒有辦法輕鬆縮小類型A
和B
至S
?縮小在類型上左右要麼
您可以使用fold
和雙方的identity
函數。這裏有一個例子:
import com.github.nscala_time.time.Imports._
import play.api.libs.json._
import scala.util.control.Exception._
val parsed = catching(classOf[IllegalArgumentException]) either DateTime.parse(str)
val mapped: Either[JsError, JsSuccess[DateTime]] = parsed
.right.map(JsSuccess(_))
.left.map(t => JsError(t.getMessage))
val fold: JsResult[DateTime] = mapped.fold(identity, identity)
在這種情況下,你開始與被改造成一個Either[JsError, JsSuccess[DateTime]]
的Either[Throwable, DateTime]
。雙方都有共同亞型JsResult[DateTime]
。
在這種情況下可以完全推斷出這些類型。內聯變量後的代碼可以減少到這一點:
(catching(classOf[IllegalArgumentException]) either DateTime.parse(str))
.right.map(JsSuccess(_))
.left.map(t => JsError(t.getMessage))
.fold(identity, identity)
你應該能夠只是做像'parsed.fold(T => JsError(t.getMessage),JsSuccess(_))'。 –
在這種情況下你也是對的,一般情況下也是這樣:可以收集左側和右側的映射函數並將其提供給'fold'! –