一个双余单子的方法有哪些?

11

当我思考更有用的标准类别时,建议将其链接到此类别

class Coordinate c where
  createCoordinate :: x -> y -> c x y
  getFirst :: c x y -> x
  getSecond :: c x y -> y
  addCoordinates :: (Num x, Num y) => c x y -> c x y -> c x y

我意识到,在这里可能存在一种更加普遍的实体,而不是某个VectorSpace-yR2。这个实体是一个Type -> Type -> Type,它包含两种类型,这两种类型都可以被提取。嗯,也许它们可以被extracted

原来,无论是comonad还是bifunctors包中都没有名为Bicomonad的东西。问题是,从范畴论的角度来看,这样的类是否有意义?与Bimonad不同(也未定义,我也不知道它可能是什么样子),一个天真的定义似乎是合理的:
class Bifunctor c => Bicomonad c where
  fst :: c x y -> x
  snd :: c x y -> y
  bidup :: c x y -> c (c x y) (c x y)

可能与法律有关

fst . bidup ≡ id
snd . bidup ≡ id
bimap fst snd . bidup ≡ id
bimap bidup bidup . bidup ≡ bidup . bidup

但我发现令人不安的是,bidup 的结果字段中包含相同类型的值,而且可能存在其他“更好”的可想象签名。

有什么想法吗?


2
不是答案,但是:(共)单子是范畴自函子中的一个(共)单子德模德(张量积为函子合成),对吧? Haskell 的双函子不是自函子。因此,我不确定真正的双(共)单子会是什么样子,甚至不确定在双函子上构建这样的东西是否有意义。但也许还有类似于双共单子的有用内容,因此这仍然是一个有趣的问题。 - Benjamin Hodgson
虽然这不是一个答案,但我来自数学领域。对我们而言,双单子是共单子的一种,即它是一个在单子范畴上的单子,其模范畴再次成为单子范畴。(回想一下,如果代数的模形成一个单子范畴,则该代数是一个双代数)。同样地,双共单子是一个单子共范畴。 - Jo Mo
@JoBe 非常有趣!你能用数学符号详细解释一下吗? - leftaroundabout
1个回答

1

这不是一个答案,而是针对 Bimonad 的建议,你能考虑一下这个方案吗?

class Biapplicative p => Bimonad p where
  (>>==) :: p a b -> (a -> b -> p c d) -> p c d

biap :: Bimonad p => p (a -> b) (c -> d) -> p a c -> p b d
biap p q = p >>== \ab cd -> q >>== \a c -> bipure (ab a) (cd c)

instance Bimonad (,) where
  (a,b) >>== f = f a b

我不确定这是否是确切正确/有趣,或者甚至是有用的,但从Haskell的角度来看,它是正确的。它是否与你的Bicomonad或类似物匹配?

2
不确定;这看起来很像普通的Monad,只是限制了元组参数(然后进行柯里化)。 - leftaroundabout
@leftaroundabout 同意。不过,我想知道你的双向协函子与限制为元组参数的协函子有何不同。 - chi
@leftaroundabout,如果你排除像Const这样无聊的函子,那么Biapplicative也几乎是如此,不是吗? - dfeuer
@dfeuer,如果你从事组合应用程序的业务,那么我认为Const是更重要的applicative之一,因为这就是applicatives擅长的地方。只是在说... - luqui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接