我參加了scala odersky課程,並認爲Flatmap採用的參數作爲參數,需要Monad的元素並返回不同類型的monad。平面地圖如何在Scala中真正起作用
trait M[T] {
def flatMap[U](f: T => M[U]): M[U]
}
在單子M [T],函數的返回類型也是相同的單子,U可能是不同類型的參數。
但是我看到互聯網上的例子,其中函數返回一個完全不同的Monad。我的印象是,返回類型的函數應該是相同的Monad。有人可以簡化下面的內容來解釋flapmap如何得到實際值而不是列表中的選項。
該列表不是Scala中的Monad。
val l= List(1,2,3,4,5)
def f(x:int) = if (x>2) Some(x) else None
l.map(x=>f(x))
//Result List[Option[Int]] = List(None , None , Some(3) , Some(4) , Some(5))
l.flatMap(x=>f(x))
//Result: List(3,4,5)
令人作嘔的話,你可以把幾乎任何你想要的簽名到'flatmap', 'map'和'filter',仍然使用'for'解析。 – Alec