繁体   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