2017-03-03 54 views
0

簡單的方法假設你有以下Either[A1,B2]實例,其中A1B2map版匹配Either[A,B],其中AB有一個常見的亞型S。有沒有辦法輕鬆縮小類型ABS縮小在類型上左右要麼

回答

0

您可以使用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) 
+1

你應該能夠只是做像'parsed.fold(T => JsError(t.getMessage),JsSuccess(_))'。 –

+0

在這種情況下你也是對的,一般情況下也是這樣:可以收集左側和右側的映射函數並將其提供給'fold'! –