簡體   English   中英

了解Scala中的monad

[英]Understanding monads in scala

我試圖了解什么是monad(不僅在scala中,而且通過使用scala為例)。 讓我們考慮一個單子最簡單的例子:

scala.Some

正如某些文章所指出的那樣, 經典意義上的每個monad應該為flatMapunit函數保留一些規則。

這是來自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] 對於Optionunit(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)) 或者,可以使用unitflatMap定義monad,將join定義為join(m) = flatMap(id, m)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM