1

我试图理解函子和幺半群之间的关系。它们经常被一起提到,但我无法将这些点联系起来。

我理解,简单地说,在编程中,可以将幺半群视为一种结构或数据类型,它具有用于组合结构中的元素的关联追加/连接函数以及一个标识元素,如果您将标识值与结构中的元素将始终返回相同的元素。

我还认识到,在编程​​中,仿函数可以被认为是一个类似于集合的结构,其映射操作类似于Array.prototype.map().

谁能帮我看看这里的大图?另外,如果我对这些概念的理解有任何遗漏,请随时告诉我。

4

2 回答 2

1

Both of these terms came from category theory a Math branch that study the cathegories of elements, the relations among them and the composability of functions between the elements. This discipline has strong influence in functional programming and because of that usually these terms appear in discussions about these paradigm.

In practical terms the translation of functor and monoid terms into programming is the following:

Functor preserves the structure and relations between elements of two different cathegories, this means that a Functor is a "structure" that provides a constructor of one element.(preserves the structure because each element is mapped into a element of the other cathegory) and a map function (preserves the relations "functions" mapping each function of the original cathegory into the target one)

Monoid it is an endofunctor (functor that origin and target cathegory is the same) that defines and identiy operation and associative operation for example a list is a monoid because it defines an identity operation (empty list) and associative operation (append)

于 2019-10-29T10:15:56.810 回答
1

函子是类别之间的结构保持转换。

  1. 将一个类别的对象映射到另一个类别的对象
  2. 同时还保留了对象之间的箭头

有点像类别之间的同态

在像 Haskell 这样的 FP 语言中,Functor类的定义有两部分:

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

类型f是将对象(Haskell 类型)映射到同一类别中的其他对象(Haskell 类型)。它映射af a.


一个幺半群(有身份的半群)

  1. 一套,S
  2. 结合手术,• : S × S → S
  3. 和 的一个元素Se : 1 → S

在 Haskell 中定义如下

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

它们是两个不同的东西,但是

它们经常被一起提到,但我无法将这些点联系起来。

他们经常被一起提到是因为另一件事,一个单子。


单子(内函子中幺半群或幺半群的特殊情况)是

  1. 一个内函子,T : S → S(内函子只是一个从一个类别到自身的函子)
  2. 连同一个自然变换, μ : S × S → S, 其中×表示函子组合 ( join)
  3. 并且η : I → S,( )I上的恒等函数在哪里Sreturn

它本质上结合了这两个概念。

在哈斯克尔

(>>=)       :: 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 的工作数学家类别。

于 2022-02-23T12:20:21.053 回答