簡體   English   中英

幺半群和函子之間有什么關系?

[英]What is the relationship between a monoid and a functor?

我試圖了解仿函數和幺半群之間的關系。 它們經常被一起提及,但我無法完全將它們聯系起來。

我明白,簡單地說,在編程中,幺半群可以被認為是一種結構或數據類型,具有關聯的追加/連接 function 用於組合結構中的元素以及標識元素,如果您將標識值與結構中的一個元素,它將始終返回相同的元素。

我還認識到,在編程中,可以將仿函數視為具有類似於Array.prototype.map()的 map 操作的類集合結構。

誰能幫我看看這里的大圖? 另外,如果我對這些概念的理解有任何遺漏,請隨時告訴我。

函子是類別之間的結構保持轉換

  1. map 個對象從一個類別到另一個類別的對象
  2. 同時還保留對象之間的箭頭

有點像類別之間的同態

在Haskell這樣的FP語言中, Functor class的定義分為兩部分:

class Functor f where 
  fmap :: (a -> b) -> (f a -> f b) 

類型f將對象(Haskell 類型)映射到同一類別中的其他對象(Haskell 類型)。 它將a映射到fa


一個幺半群(具有身份的半

  1. 一組, S
  2. 結合操作, •: S × S → S
  3. S的一個元素, e: 1 → S

Haskell中定義如下

class Semigroup s => Monoid s where
  mempty  :: s
  
  mappend :: s -> s -> s
  mappend = (<>)

它們是兩種不同的東西,但是

它們經常被一起提及,但我無法完全將它們聯系起來。

他們經常一起被提及是因為另一件事,一個 Monad。


一個 monad(monoids 或 endofunctors 中的 monoids 的特例)是

  1. 一個內函子, T: S → S (內函子只是一個從類別到自身的函子)
  2. 連同自然變換, μ: S × S → S ,其中×表示函子組合 ( join )
  3. η: I → S ,其中IS上的身份內函子( 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.

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