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不是半环的一个例子,但是(正方形)矩阵在矩阵加法和矩阵乘法下确实形成了一个半环。)你也可以考虑看双模。真的喜欢这个解决方案!但事实上,我认为这对于我所面临的问题来说是过分的。非常感谢:)