haskell - 是否存在与 Bifunctor 等价的 Monoid?

标签 haskell typeclass category-theory

使用 Bifunctor 时,我们可以访问 firstsecond “map” 函数。所以基本上它是一个仿函数,允许我们以两种不同的方式进行 fmap。

Monoid 有类似的东西吗?一些概念允许我们以两种不同的方式附加?

例如,想象一个不透明的Matrix类型。它不是列表的列表或向量的向量,我们不知道它的内部结构如何,但我们知道我们可以向其附加行和列。

是否有某种类型类可以执行此操作?

class X a where
    firstAppend :: a -> a -> a
    secondAppend :: a -> a -> a

instance X Matrix where
    firstAppend = appendRow
    secondAppend = appendColumn

最佳答案

我想你可以用索引 Monoids 做这样的事情:

{-# LANGUAGE PolyKinds      #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE TypeFamilies   #-}

module IndexedMonoids where

class MonoidIx (m :: k -> *) where
  type Null m :: k
  type Mult m (i :: k) (j :: k) :: k

  nullIx :: m (Null m)
  multIx :: m i -> m j -> m (Mult m i j)

class MonoidIx2 (m :: k -> l -> *) where
  type Null1 m :: k
  type Null2 m :: l
  type Mult1 m (i :: k) (j :: k) :: k
  type Mult2 m (p :: l) (q :: l) :: l

  null1Ix :: m (Null1 m) p
  null2Ix :: m i (Null2 m)
  mult1Ix :: m i p -> m j p -> m (Mult1 m i j) p
  mult2Ix :: m i p -> m i q -> m i (Mult2 m p q)

当你把 4 个 block 放在一起时,你会期待一堆定律(恒等性、结合性、交换性)。索引 Monoid 的一个简单示例:索引无关紧要的示例:

newtype Dummy (m :: *) (i :: k) = Dummy { getDummy :: m }

instance Monoid m => MonoidIx (Dummy m :: * -> *) where
  type Null (Dummy m)     = ()
  type Mult (Dummy m) i j = ()

  nullIx = Dummy mempty
  multIx (Dummy i) (Dummy j) = Dummy $ mappend i j

我会让你实现矩阵实例;)

关于haskell - 是否存在与 Bifunctor 等价的 Monoid?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46646899/

相关文章:

haskell - 停止/Pickling/Unpickling/恢复计算

haskell - 为什么将数据类型作为约束添加到类型声明会导致匹配错误而不是更正确的错误?

Haskell 类型约束

.net - 类型类有什么问题?

category-theory - 在集合的范畴中,为什么单例集合是终端?

haskell - 什么是自由单子(monad)?

haskell - 因子分解器的简单定义

haskell - 为什么会出现这种类型错误?

haskell - 有没有办法在模式匹配期间绑定(bind)存在数据类型的抑制类型变量?

haskell - 生成此数组时无限循环