【问题标题】:What would be the methods of a bi-comonad?双胞胎的方法是什么?
【发布时间】:2017-04-11 15:09:47
【问题描述】:

一边思考什么更有用的标准类建议to this one

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-yR2Type -> Type -> Type,它的两个包含的类型都可以提取。嗯,也许他们可以是extracted

原来comonadbifunctors 包都不包含名为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 的结果的两个字段都包含相同的类型,并且还有很多其他的,也许是“更好”的可以想象的签名。

有什么想法吗?

【问题讨论】:

  • 不是答案,而是:A (co)monad 只是 endo 函子类别中的 (co)monad(函子组合作为张量积),对? Haskell 双函子不是内函子。所以我不确定真正的双(共)单子会是什么样子,或者即使在双函子之上构建这样的东西是否有意义。但也许还有一些有用的东西看起来“有点像”双胞胎,所以这仍然是一个有趣的问题。
  • 也不是答案,但我来自数学方面。对我们来说,bimonad 是一个 comonoidal monad,即它是一个 monoidal 类别上的 monad,其模块类别又是 monoidal 类别。 (回想一下,如果代数是双代数,代数上的模块就形成了单曲面范畴)。同样,双单胞胎是单环单胞胎。
  • @JoBe 很有趣!你能用数学符号详细说明一下吗?

标签: haskell category-theory comonad bifunctor


【解决方案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 或类似内容匹配?

【讨论】:

  • 不确定;这看起来很像普通的 Monad 仅限于元组参数(然后被柯里化)。
  • @leftaroundabout 同意。不过,我确实想知道您的双单胞是否/如何与仅限于元组参数的单胞不同。
  • @leftaroundabout,Biapplicative 不也是这样吗(如果你排除了像 Const 这样无聊的函子)?
  • @dfeuer,我认为Const 是更重要的应用程序之一,如果您从事编写它们的业务,那是应用程序擅长的。只是说...
猜你喜欢
  • 2012-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2014-07-03
相关资源
最近更新 更多