[英]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.