使用 Bifunctor
时,我们可以访问 first
和 second
“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/