在思考什么更有用的标准类建议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
编?结果不是
comonad
也不是 bifunctors
包中包含一个名为 Bicomonad
的东西.问题是,从理论上讲,这样的类(class)是否有意义?不像 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
结果的两个字段令人不安包含相同的类型,并且还有很多其他的,也许是“更好”的可以想象的签名。有什么想法吗?
最佳答案
这不是答案,而是 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
匹配或类似的东西?
关于haskell - 双胞胎的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40835094/