2016-01-10 16 views
16

Scala'da Option[Int]'u Either[String, Int]'a dönüştürmem gerektiğini varsayalım. Ben böyle yapmak istiyorum: Scala'da Seçeneği Dönüştürme

def foo(ox: Option[Int]): Either[String, Int] = 
    ox.fold(Left("No number")) {x => Right(x)} 

Maalesef Yukarıdaki kod derleme değil ve ben açıkça tip Either[String, Int] eklemek gerekir:

ox.fold(Left("No number"): Either[String, Int]) {x => Right(x)} 

mümkün Either Buna Option dönüştürmek için mi türü eklemeden yol?
Option'u Either'a dönüştürmeyi nasıl önerirsiniz?

cevap

28

Hayır, bu şekilde yaparsanız, türü dışarıda bırakamazsınız.

Left("No number") türünün Either[String, Nothing] olduğu anlaşılmalıdır. Sadece Left("No number")'dan itibaren derleyici, Either'un ikinci türünün Int olmasını isteyeceğini bilemez ve yazım çıktısı, derleyicinin tüm yönteme bakıp Either[String, Int] olması gerektiğine karar vermez.

Bunu bir çok farklı şekilde yapabilirsiniz. desen eşleştirme ile Örnek:

def foo(ox: Option[Int]): Either[String, Int] = 
    if (ox.isDefined) Right(ox.get) else Left("No number") 

ya Either.cond ile:.

def foo(ox: Option[Int]): Either[String, Int] = 
    Either.cond(ox.isDefined, ox.get, "No number") 
+0

'ox.map (Sağ (_)) getOrElse (Sol

def foo(ox: Option[Int]): Either[String, Int] = ox match { case Some(x) => Right(x) case None => Left("No number") } 

Or if ifadesi ile

("No number")) 'de çalışır ancak bir ara seçenek oluşturur. – knutwalker

+7

Ve ayrıca 'ox.toRight (" No Number ")' vardır, ancak bu yöntem açık bir dönüş türüne sahip olmadığından, "[String, Int] ile Ürünle Serileştirilebilir" ile anlamlandırılır – knutwalker

+0

@knutwalker Oh, teşekkürler . 'ToRight' çözümünü beğendim. Ben sadece türünü ekleyeceğim: 'ox.toRight (" No Number "): Ya [String, Int]'. – Michael