2014-01-06 32 views
1

我成功地實施使用flatMap以下咖喱功能:從flatMap轉換咖喱函數來表達

def map3(a: Option[Int], b: Option[Int], c: Option[Int]) 
(f: (Int, Int, Int) => Option[Int]): Option[Int] = { 
    a.flatMap(x => b.flatMap(y => c.flatMap(z => f(x,y,z)))) 
    } 

實施例:

scala> map3(Some(1), Some(2), Some(3))((x,y,z) => Some(x*y*z)) 
res0: Option[Int] = Some(6) 

然而,當我試圖實現具有相同功能for expression

def map3ForExpr(a: Option[Int], b: Option[Int], c: Option[Int]) 
(f: (Int, Int, Int) => Option[Int]): Option[Int] = { 
    for { 
     x <- a 
     y <- b 
     z <- b 
     f(x,y,z) 
    } 
    } 

...以下編譯時錯誤發生:

C:\Users\Kevin\Workspace\side-work>scalac TestForComprehensionMap3.scala TestForComprehensionMap3.scala:13: error: '<-' expected but '}' found. } ^

基於閱讀這個優秀的post,在我看來,我的map3ForExpr相當於我map3代碼。

請讓我知道我做錯了什麼。

回答

2

凱文,你不得不從返回東西換理解:

for{ 
    x <- a 
    y <- b 
    z <- c 
    out <- f(x, y, z) 
} yield out 

也就是說,它需要知道什麼mapflatMap在加上它需要一個yeild表達式可以返回一個值。如果沒有yield,你會拿出一個desugared foreach

另外,補充一點,如果你僅僅yieldf(x, y, z),而不是先拆包成out,你會風與Option[Option[Int]]這是不是你想要的。

+0

謝謝,這工作。 –

+1

@KevinMeredith更重要的是,在閱讀那篇文章後(鏈接非常好的帖子),然後看看我寫的內容,你就明白了原因。 – wheaties

+0

不應該把那個優秀的帖子的'for-expression',第1個子彈點修改爲包含'yield'嗎?例如:'爲{ 綁定< - list out <-f(bound) } yield out' –