【问题标题】:What is the relationship between a monoid and a functor?幺半群和函子之间有什么关系?
【发布时间】:2019-10-27 20:07:19
【问题描述】:

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

我明白,简单地说,在编程中,monoid 可以被认为是一种结构或数据类型,具有用于组合结构中的元素的关联 append/concat 函数以及一个恒等元素,如果你以交换方式组合结构中元素的标识值将始终返回相同的元素。

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

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

【问题讨论】:

  • @Fabio 你说的是幺半群吧?
  • 仿函数是将纯函数提升到特定上下文中的操作,在该上下文中,除了返回值之外,还会执行相关效果。似乎没有相关的联系。
  • @bob 并非所有仿函数都与效果有关
  • @Bergi 你是说身份吗?我仍然会说 OP 试图将提升与组合进行比较。
  • @Bergi 上下文是容器,我认为效果是不确定的。 Maybe/Optional 不也是一种非确定性效应,您最多只对一个结果感兴趣吗?

标签: functional-programming functor monoids semigroup


【解决方案1】:

这两个术语都来自范畴论一个数学分支,该分支研究元素的分类、它们之间的关系以及元素之间函数的可组合性。这门学科在函数式编程中具有强大的影响力,因此这些术语通常出现在有关这些范式的讨论中。

实际上,函子和幺半群术语在编程中的翻译如下:

Functor 保留了两个不同类别的元素之间的结构和关系,这意味着 Functor 是一种“结构”,它提供了一个元素的构造函数。(保留结构,因为每个元素都被映射到另一个分类的一个元素)和一个映射函数(保留将原始分类的每个函数映射到目标函数的关系“函数”)

Monoid 它是一个内函子(起点和目标类别相同的函子),它定义和标识操作和关联操作,例如,列表是一个幺半群,因为它定义了一个标识操作(空列表) 和关联操作(追加)

【讨论】:

    【解决方案2】:

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

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

    类似于类别之间的同态

    在Haskell等FP语言中,Functor类的定义分为两部分:

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

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


    一个幺半群(semigroups 有身份)

    1. 一套,S
    2. 结合一个操作,• : S × S → S
    3. Se : 1 → S的元素

    在 Haskell 中定义如下

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

    它们是两个不同的事物但是

    他们经常被一起提到,但我一直没能完全 连接点。

    他们经常被一起提到是因为另一个事物,一个Monad。


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

    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 只是 monoid 属于 endofunctors 范畴,有什么问题?

    您可能已经看到在 FP 论坛上开玩笑地使用它。这是一个版本的

    X 中的单子只是 X 的内函子范畴中的一个幺半群

    最初来自 Mac Lane 的工作数学家类别。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-12
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      相关资源
      最近更新 更多