gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:30:16 24 4
gpt4 key购买 nike

使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com