【发布时间】:2012-11-25 22:38:44
【问题描述】:
Haskell 的Data.Bifunctor 基本上是:
class Bifunctor f where
bimap :: (a -> c) -> (b -> d) -> f a b -> f c d
我也可以找到Biapply。我的问题是,为什么没有完整的双层次结构(bierarchy?),例如:
class Bifunctor f => Biapplicative f where
bipure :: a -> b -> f a b
biap :: f (a -> b) (c -> d) -> f a c -> f b d
class Biapplicative m => Bimonad m where
bibind :: m a b -> (a -> b -> m c d) -> m c d
bireturn :: a -> b -> m a b
bireturn = bipure
bilift :: Biapplicative f => (a -> b) -> (c -> d) -> f a c -> f b d
bilift f g = biap $ bipure f g
bilift2 :: Biapplicative f => (a -> b -> c) -> (x -> y -> z) -> f a x -> f b y -> f c z
bilift2 f g = biap . biap (bipure f g)
Pair 是这些的一个实例:
instance Bifunctor (,) where
bimap f g (x,y) = (f x, g y)
instance Biapplicative (,) where
bipure x y = (x,y)
biap (f,g) (x,y) = (f x, g y)
instance Bimonad (,) where
bibind (x,y) f = f x y
类型如...
data Maybe2 a b = Fst a | Snd b | None
--or
data Or a b = Both a b | This a | That b | Nope
...IMO 也会有实例。
没有足够的匹配类型吗?还是我的代码存在严重缺陷?
【问题讨论】:
-
您如何为
Maybe2 a b定义bipure?Fst和Snd都不是规范的,剩下的None几乎没有用处。我认为这些类的大多数重要候选类型都有类似的问题,但这只是一个猜测。至少Or看起来是合理的。好问题。 -
另外,你如何定义
bijoin? -
从实际的角度来看,我想说这些类型类没有被使用的原因是它们很少有有趣的实例。考虑
Bifunctor有多少实例。那么Biapplicative或Bimonad会更少(可能为0)。除此之外,这当然是一个有趣的问题。您是否尝试过构建这些建议的类型类的一些完整实例? -
定义
Bifunctor的bifunctors库确实有一个Biapplicative类,但它没有定义bipure和<<*>>应该遵守的任何法律,类似于定义的法律对于pure和<*>。它定义了一些实例:您的(,),一个用于Const,以及一些与它们大致同构的类型。更高元组的实例任意(?)要求产品中最左边的类型是幺半群,以便它们可以简单地通过<<*>>累加。 -
(应用函子是强松散幺半函子这一事实可能表明对 n>2 元组的幺半群限制不是任意的,但我不知道“强松散幺半双函子”是否是东西。)