這是另一個解釋它的嘗試。 Option
是一個Monad,它以簡化的方式可能被看作是一個通用的容器,可以保存一些值。
map
是一種轉換操作,它允許您使用簡單函數對「原始」類型轉換monad中的值。
flatMap
與map
類似,但稍微複雜一些:它允許您使用接受「原始」值的函數轉換monad中的值,但返回相同monad的實例並仍然是結果你只會得到Monad[B]
而不是Monad[Monad[B]]
,它將由map
生成。換句話說,flatMap
「變平」結果。
那麼現在你的map2
做什麼?它接受2個Option
monad實例和一個將「原始」對類型轉換爲單個新的「原始」類型並返回該結果類型的Option
的函數。從邏輯上講,這與map
類似,但要實現它,您需要一個flatMap
。要致電f
,您需要「解包」ao
和bo
。但monad並沒有提供一種方法來「解開」原始價值。您可能只想使用map
。畢竟map2
在邏輯上與它相似!然而,如果你寫
ao.map(aa =>
bo.map(bb => f(aa,bb)))
你可能天真地做,它不會像你所期望的那樣工作。原因是bo.map(bb => f(aa,bb))
返回Option[C]
(記住,沒有標準的方法來「解壓」一個單子),因此你的函數傳遞給ao.map(aa => ...)
返回Option[C]
,因此結果將是Option[Option[C]]
。但這正是flatMap
來救援!它允許你將這個雙重Option
「解包」成簡單的Option[C]
。
顯然這個解釋很天真,但我希望它能幫助你對發生的事情有一個直覺。
這是功能編程與斯卡拉的練習嗎? –