2016-11-27 78 views
11

在沉思些什么有用的标准类建议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-yR2,一个较为普遍的野兽可能潜伏在这里:一个Type -> Type -> Type它的两个包含类型都可以提取。嗯,也许他们可以是extract ed

结果都不是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

不是答案,而是:(co)monad只是** endo **仿函数的范畴中的一个(复合)monoid(具有仿函数构成作为张量积),对吗? Haskell双刃管不是内管工。所以我不确定一个真正的双(单)monad会是什么样子,或者即使在双功能器之上构建这样一个事情也是有意义的。但也许还有一些有用的东西看起来“有点像”双生子,所以它仍然是一个有趣的问题。 –

回答

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',只限于元组参数(然后被curried)。 – leftaroundabout

+0

@leftaroundabout同意。不过,我确实怀疑,如果/你的双子座与限制为元组参数的共同点不同。 – chi

+0

@leftaroundabout,对于'Biapplicative'也不是那么简单(如果你排除了像Const一样的无聊函数)? – dfeuer

相关问题