【发布时间】: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-y 或 R2: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 的结果的两个字段都包含相同的类型,并且还有很多其他的,也许是“更好”的可以想象的签名。
有什么想法吗?
【问题讨论】:
-
不是答案,而是:A (co)monad 只是 endo 函子类别中的 (co)monad(函子组合作为张量积),对? Haskell 双函子不是内函子。所以我不确定真正的双(共)单子会是什么样子,或者即使在双函子之上构建这样的东西是否有意义。但也许还有一些有用的东西看起来“有点像”双胞胎,所以这仍然是一个有趣的问题。
-
也不是答案,但我来自数学方面。对我们来说,bimonad 是一个 comonoidal monad,即它是一个 monoidal 类别上的 monad,其模块类别又是 monoidal 类别。 (回想一下,如果代数是双代数,代数上的模块就形成了单曲面范畴)。同样,双单胞胎是单环单胞胎。
-
@JoBe 很有趣!你能用数学符号详细说明一下吗?
标签: haskell category-theory comonad bifunctor