在思考更有用的标准类时,建议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
可以提取两个包含的类型。嗯,也许他们可以 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
的结果的两个字段都包含相同的类型,而且还有很多其他的,可能是“更好”的可想象的签名。
有什么想法吗?
答案 0 :(得分: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
或类似内容相匹配吗?