讀this Wikibook about Haskell and Category Theory basics,我瞭解函子:爲什麼'pure'只適用於Applicative,而不是Functor?
函子基本上是類別之間的變換,所以給定的 類別C和d,函子F:Ç - > d
映射任何對象A在C至F(A),在D.
地圖態射F:A - >中的B C至F(F):F(A) - > F(B)在D
。 ..聽起來很好。後來一個例子提供:
讓我們樣本的實例,也:
instance Functor Maybe where
fmap f (Just x) = Just (f x)
fmap _ Nothing = Nothing
這裏的關鍵部分:類型構造可能採取任何類型T的 新的類型,也許T.另外,fmap限制爲Maybe類型需要一個 函數a - > b函數Maybe a - > Maybe b。但就是這樣!我們有 定義了兩部分,一部分將Hask中的對象帶到 的另一個類別(也許類型和函數定義在Maybe 類型中)中的對象,以及一些在Hask中將態射投射到 這個類別中的態射。所以也許是一個仿函數。
我明白fmap
的定義是如何定義的。我對「類型構造函數Maybe」如何提供第一部分感到困惑。我寧願預期像pure
。
如果我弄清楚了,Maybe
寧願地圖C
到D
。 (因此是一個類別級別的態射,這可能是一個Functor的要求)
我想你可以改變我的問題是這樣的:有沒有一個Functor,沒有明顯的執行pure
?
感謝所有有用的答案。我選擇了最詳細的一個「正確」。 –
一個簡單的'Functor'不承認'pure'就是'data void a'。這個實例看起來像'instance Functor Void where {fmap f x = {}}'的case x。 (我沒有把這個答案作爲答案,因爲我不認爲這個例子是特別有啓發性的,即使它回答了你在實體中實際詢問的唯一問題。) –
@DanielWagner我認爲這是同構* * only * Functor'不允許使用'pure':如果在Functor中有*任何*值'v',您可以定義'pure x = x <$ v'。我認爲'純粹'的每一種選擇都是這種形式。當然,這通常不是很獨特。 –