[英]fmapping arrows over monads
据我所知,一个箭头是Profunctor,其中一个可以将其输入和输出,而是一个可以映射在一个仿函数的箭头?
据我所知,答案是“不”,因为fmap
函数类型签名是(a -> b) -> fa -> fb
而且不承认Arrow ab
,但我希望我所要求的是清楚的。
我正在寻找一种方法,例如,使用箭头转换一个Maybe
输入,其中Nothing
转到Nothing
, Just x
转到Just y
,其中y
是将箭头应用于x
。
Arrow
结合了两个概念。 正如你所说,其中一个就是一个profunctor,但首先它只是一个特定的类别类别 (实际上是超类证据)。
这与这个问题高度相关:是的, fmap
的签名是(a -> b) -> fa -> fb
,但实际上这几乎不是函子可以做的全部通用! 在数学中,算符是两类C和d,在C的每个箭头分配给在d中的箭头之间的映射。 不同类别的箭头,就是这样! 标准的Functor
类仅捕获最简单的特殊情况,即Hask类别中的endofunctors 。
仿函数类的完整通用版本实际上看起来更像这样(这里是我的约束类别版本):
class (Category r, Category t) => Functor f r t | f r -> t, f t -> r where
fmap :: r a b -> t (f a) (f b)
或者,在伪语法中,
class (Category (──>), Category (~>)) => Functor f (──>) (~>) where
fmap :: (a ──> b) -> f a ~> f b
当其中一个类别是正确的箭头而不是普通的功能类别时,这肯定也可以工作。 例如,您可以定义
instance Functor Maybe (Kleisli [] (->)) (Kleisli [] (->)) where
fmap (Kleisli f) = Kleisli mf
where mf Nothing = [Nothing]
mf (Just a) = Just <$> f a
用得像
> runKleisli (fmap . Kleisli $ \i -> [0..i]) $ Nothing
[Nothing]
> runKleisli (fmap . Kleisli $ \i -> [0..i]) $ Just 4
[Just 0,Just 1,Just 2,Just 3,Just 4]
如果使用标准的profunctor-ish箭头,不确定这对于任何非常重要的事情是否有用。 这是在其他类别不属于 Hask -profunctors肯定是有用的, 例如
instance (TensorSpace v) => Functor (Tensor s v) (LinearFunction s) (LinearFunction s)
表示你可以在张量积的单个因子上映射线性函数(而通常不可能在这样的乘积上映射非线性函数 - 结果将取决于向量空间的基础选择)。
我正在寻找一种方法,例如,用箭头转换一个
Maybe
输入,其中Nothing
转到Nothing
,Just x
转到Just y
,其中y
是将箭头应用于x
。
这可以针对特定的Functor
(例如Maybe
)实现,虽然ArrowChoice
可能是必要的:
maybeAmap :: ArrowChoice p => p a b -> p (Maybe a) (Maybe b)
maybeAmap p =
maybe (Left ()) Right
^>> returnA +++ p
>>^ const Nothing ||| Just
请参阅箭头等效于mapM? 用于在proc-notation中编写的类似函数。
说到mapM
, profunctors有一个名为Traversing
的有趣类 :
-- Abbreviated class definition:
class (Choice p, Strong p) => Traversing p where
traverse' :: Traversable f => p a b -> p (f a) (f b)
wander :: (forall f. Applicative f => (a -> f b) -> s -> f t) -> p a b -> p s t
Traversing
的旗帜实例是Star
profunctor的实例 ,它提供熟悉的traverse
函数的替代编码。 需要注意的是,虽然leftaroundabout的回答表明非Hask仿函数为其不一定Hask -profunctors类,用Traversing
我们有一个建筑Profunctor
s表示不一定有Category
的实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.