[英]Understanding monads in scala
我試圖了解什么是monad(不僅在scala中,而且通過使用scala為例)。 讓我們考慮一個單子最簡單的例子:
scala.Some
正如某些文章所指出的那樣, 經典意義上的每個monad應該為flatMap
和unit
函數保留一些規則。
這是來自scala.Some
的定義。
@inline final def flatMap[B](f: A => Option[B]): Option[B]
因此,要更好地理解它,我想從范疇論的角度來理解它。 因此,我們正在考慮一個monad,它應該是一個函子( 但介於什么之間? )。
在這里,我們必須對Option[A]
和Option[B]
以及flatMap
以及f: A => Option[B]
傳入其中的f: A => Option[B]
應該在它們之間定義一個Functor 。 但是在傳統類別定義中,它是從類別到其本身的函子。
類別是scala類型的類別,其中對象是類型,箭頭是這些類型的值之間的函數。 Option
是此類的endofunctor。 對於Scala類別中的每個對象(即類型), Option
類型構造函數都將每個類型A
映射到類型Option[A]
。
另外,它將每個箭頭f: A => B
映射到箭頭fo: Option[A] => Option[B]
,這是Option.map
作用。
Monad是函子M
,它具有兩個運算符,分別是unit: A => M[A]
和join: M[M[A]] => M[A]
。 對於Option
, unit(x: A) = Some(x)
和join
可以定義為:
def join[A](o: Option[Option[A]]): Option[A] = o match {
case None => None
case Some(i) => i
}
flatMap
然后可以被定義為, flatMap(f, m) = join(map(f, m))
或者,可以使用unit
和flatMap
定義monad,將join
定義為join(m) = flatMap(id, m)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.