2016-07-07 115 views
1

我想了解什麼單子(不只是在斯卡拉,但例如使用斯卡拉)。讓我們考慮一個單子的最(在我看來)簡單的例子:在斯卡拉了解單子

scala.Some 

正如一些文章的狀態,its classic sense每個單子應保留爲flatMapunit功能的一些規則。

這裏是scala.Some

@inline final def flatMap[B](f: A => Option[B]): Option[B] 

這樣的定義,更好地理解它我想了解它from the category theory standpoint。所以,我們正在考慮一個monad,它應該是一個仿函數(但是在什麼之間?)。

下面我們就來Option[A]類別和Option[B],並與f: A => Option[B]傳遞給它沿flatMap應該定義一個函子它們之間。但是在傳統類別定義中,它是從類別到其自身的函子。

+2

你的問題到底是什麼? monad的概念和'flatMap'的作用很簡單:monad是一個包含一個值的盒子,並且你給一個'flatMap'函數'f',它用框中的值做一些事情,然後你回來另一個框中包含將「f」應用於原始框的值的結果。 – Jesper

+1

該類別是scala類型的類別,所以'Option'是該類別的endofunctor。 – Lee

+0

@Lee那麼它將每個類型'T'映射到'Option [T]'? – user3663882

回答

4

該類別是scala類型的類別,其中對象是類型,箭頭是這些類型的值之間的函數。 Option是這個類別的內幕管理員。對於Scala類別中的每個對象(即類型),Option類型構造函數將每個類型A映射到Option[A]類型。

另外,它將每個箭頭f: A => B映射到一個箭頭fo: Option[A] => Option[B]這就是Option.map所做的。

Monad是Functor 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))。或者,可以使用定義爲join(m) = flatMap(id, m)unitflatMapjoin來定義單子。

+0

在scala中'join'是'flatten'(據我所知)。 – user3663882

+0

讓我再問你一個問題。正如你所說,我們有兩個操作'join'和'unit'。在[類別monad定義](https://en.wikipedia.org/wiki/Monad_(category_theory)#Formal_definition)中,我們也有兩個自然轉換。根據類別定義,它是相同的還是我們可以證明我們的monad是一個「monad」。我沒有自己做,也不想要實際的證據(如果是這樣)。只是想知道是否。 – user3663882

+1

@ user3663882是的,'join'和'unit'完全對應mu和eta。此外,[法律確實適用於他們](http://eed3si9n.com/learning-scalaz/Monad+laws.html);關聯性對應於T^3的圖,左右身份是IIRC,等同於另一個。 – phg