Haskell 有一个等价于Bifunctor的幺半群吗?

Haskell 有一个等价于Bifunctor的幺半群吗?,haskell,typeclass,category-theory,Haskell,Typeclass,Category Theory,使用时,我们可以访问第一个和第二个的“映射”功能。所以基本上是一个函子,它允许我们以两种不同的方式fmap 对于幺半群,有类似的东西吗?一些概念允许我们以两种不同的方式附加 例如,想象一个不透明的矩阵类型。它不是一个列表列表或向量向量,我们不知道它内部是如何构造的,但我们知道我们可以在其中附加行和列 是否有某个类型类允许这样做 class X a where firstAppend :: a -> a -> a secondAppend :: a -> a -&

使用时,我们可以访问
第一个
第二个
的“映射”功能。所以基本上是一个
函子
,它允许我们以两种不同的方式
fmap

对于
幺半群
,有类似的东西吗?一些概念允许我们以两种不同的方式附加

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

是否有某个类型类允许这样做

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

instance X Matrix where
    firstAppend = appendRow
    secondAppend = appendColumn

我想你可以用索引幺半群做这样的事情:

{-# 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个块放在一起时,你会期望有一系列的定律(恒等式,结合性,交换性)。索引幺半群的一个简单例子:索引不重要的例子:

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

我将让您实现矩阵的实例;)

我不知道标准定义了什么。你当然可以自己定义它。我不确定这个值,因为在类型级别上没有什么可区分的。我认为一个更合适的解决方案可能是
newtype
wrapper和两个不同的实例,类似于
Data.Monoid
中的
Product
Sum
。耶@ryachza我认为这可能是一个更合适的解决方案。这通常是以特别的方式进行的,例如,或者。根据您的具体要求,你可以研究一下,它们基本上是代数结构,有“加法”和“乘法”运算。(你的代码>附录< /CONTRO/<代码> AppEngult不是半环的一个例子,但是(正方形)矩阵在矩阵加法和矩阵乘法下确实形成了一个半环。)你也可以考虑看双模。真的喜欢这个解决方案!但事实上,我认为这对于我所面临的问题来说是过分的。非常感谢:)