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-y or R2:a Type -> Type -> Type,它的两个包含的类型都可以被提取。嗯,也许他们可以被extract教育

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

有什么想法吗?

4

1 回答 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或类似的东西相匹配吗?

于 2016-11-28T00:44:17.567 回答