[英]What is the relationship between a monoid and a functor?
我試圖了解仿函數和幺半群之間的關系。 它們經常被一起提及,但我無法完全將它們聯系起來。
我明白,簡單地說,在編程中,幺半群可以被認為是一種結構或數據類型,具有關聯的追加/連接 function 用於組合結構中的元素以及標識元素,如果您將標識值與結構中的一個元素,它將始終返回相同的元素。
我還認識到,在編程中,可以將仿函數視為具有類似於Array.prototype.map()
的 map 操作的類集合結構。
誰能幫我看看這里的大圖? 另外,如果我對這些概念的理解有任何遺漏,請隨時告訴我。
函子是類別之間的結構保持轉換。
它
有點像類別之間的同態。
在Haskell這樣的FP語言中, Functor class的定義分為兩部分:
class Functor f where
fmap :: (a -> b) -> (f a -> f b)
類型f
將對象(Haskell 類型)映射到同一類別中的其他對象(Haskell 類型)。 它將a
映射到fa
。
一個幺半群(具有身份的半群)
S
•: S × S → S
S
的一個元素, e: 1 → S
Haskell中定義如下
class Semigroup s => Monoid s where
mempty :: s
mappend :: s -> s -> s
mappend = (<>)
它們是兩種不同的東西,但是
它們經常被一起提及,但我無法完全將它們聯系起來。
他們經常一起被提及是因為另一件事,一個 Monad。
一個 monad(monoids 或 endofunctors 中的 monoids 的特例)是
T: S → S
(內函子只是一個從類別到自身的函子)μ: S × S → S
,其中×
表示函子組合 ( join
)η: I → S
,其中I
是S
上的身份內函子( return
)它本質上結合了這兩個概念。
Haskell
(>>=) :: m a -> (a -> m b) -> m b
(>>) :: m a -> m b -> m b
return :: a -> m a
暗示
fmap f m = m >>= return . f
更簡潔地說,
monad 只是 endo functors類別中的一個幺半群,有什么問題?
您可能已經在 FP 論壇上看到過開玩笑地使用它。 這是一個版本
X 中的單子只是 X 的內函子范疇中的幺半群
最初來自 Mac Lane 的工作數學家類別。
這兩個術語都來自范疇論的一個數學分支,該分支研究元素的分類、元素之間的關系以及元素之間函數的可組合性。 這門學科在函數式編程中具有強大的影響力,因此這些術語通常出現在有關這些范式的討論中。
實際上,函子和幺半群術語在編程中的翻譯如下:
Functor保留了兩個不同類別的元素之間的結構和關系,這意味着 Functor 是一個“結構”,它提供了一個元素的構造函數。(保留結構,因為每個元素都映射到另一個類別的元素)和一個map function (保留關系“功能”映射每個 function 的原始分類到目標之一)
Monoid它是一個內函子(起源和目標類別相同的函子),它定義和標識操作和關聯操作,例如列表是一個幺半群,因為它定義了一個標識操作(空列表)和關聯操作(附加)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.