2016-07-13 4 views
1

型の不一致のエラーが発生しましたが、その理由を理解できないようです。理解のため、先物に型不一致があります

found:  scala.concurrent.Future[UserSales] 
required:  Option[UserSales] 

     userSalesOpt <- getOrSetUserSales(userSalesCacheKey) 

I have tried creating another for {} clause but that didn't solve the issue. What should I be doing as I am stuck?? 

は、ここで私が使用していた方法です:

UserDAO 
    def getByUsername(name: String): Future[Option[User]] 

UserController: 
    def getOrSetUserSales(key: String): Future[Option[UserSales]] 

class UserController ... { 

    def index = Action.asyc { 
    val maybeUserSalesOpt: Future[Option[UserSales]] = for { 
     userOpt <- userDao.getByUsername(name) 
    } yield { 
     for { 
      user <- userOpt 
      userSalesCacheKey = name + "whatever" 
      userSalesOpt <- getOrSetUserSales(userSalesCacheKey) 
     } yield { 
     for { 
      userSales <- userSalesOpt 
     } yield userSales 
     } 
    } 

    for { 
     maybeUserSales <- maybeUserSalesOpt 
    } yield { 
     if(maybeUserSales.isDefined) { 
     Ok("found") 
     } else { 
     Ok("error") 
     } 

    } 

    } 

} 

答えて

1

型の不一致がfor-理解の定義から来ています。結果の型は、宣言型と同じである必要があります。

リスト上での理解がある場合、結果のタイプもリストであることがわかります。私は別の何かを返すようにしようと

for(i <- List(Some(1), None, Some(2)); j <- i) yield j 
res: List[Int] = List(1, 2) 

、コンパイラが文句を言うだろう:あなたが未来のあるべき戻り値の型に対し、オプションを返すようにしようとしている

import scala.concurrent.Future 
import scala.concurrent.ExecutionContext.Implicits.global 

for(i <- Future.apply(Option(2)); j <- i) yield j 
<console>:**: error: type mismatch; 
found : Option[Int] 
required: scala.concurrent.Future[?] 
       for(i <- Future.apply(Option(2)); j <- i) yield j 
               ^

。ここで


(私はそれをコンパイルするので、抽象すべて)Scalaでこの種の問題を解決する方法である:

// Dummy types 
type UserSales = String 
type User = String 

// Types of the main functions we have 
type GetByUsername = String => Future[Option[User]] 
type GetOrSetUserSales = String => Future[Option[UserSales]] 

// Type of the function I want 
type UserSaleGetter = (String, String) => Future[Option[UserSales]] 

// A function that solves our problem (function combinator) 
def makeConditionalUserSalesGetter(userGetter: GetByUsername, 
            salesGetter: GetOrSetUserSales): UserSaleGetter = { 
    (userName: String, prodName: String) => 
     for(optUser <- userGetter(userName); p <- salesGetter(userName+prodName)) 
      yield p 
} 

今、私たちは、ユーザを与えること(タイプUserSaleGetter付き)複合機能を使用することができます製品を購入してFuture[Option[UserSales]]に戻ってください。

+0

しかし、私の返品タイプは、将来の[オプション[UserSales]]ですか? – Blankman

+0

'for {user < - userOpt ...'ループではOption(userOpt)で始まり、(getOrSetUserSales()から来る)Futureを返します。それはコンパイラが不平を言っていることです。 – marios

関連する問題