任何monad也是可应用的函子,任何可应用的函子都是函子。另外,任何comonad都是函子。在共模函子和函子之间是否有类似的概念,例如共应用函子,它的特性是什么?
更新:我也对这种概念的可能用途感兴趣。
任何monad也是可应用的函子,任何可应用的函子都是函子。另外,任何comonad都是函子。在共模函子和函子之间是否有类似的概念,例如共应用函子,它的特性是什么?
更新:我也对这种概念的可能用途感兴趣。
Answers:
首先:
任何monad也是可应用的函子,任何可应用的函子都是函子。
在Haskell的情况下,这是正确的,但是(读Applicative
作“强松散单极子函子”)通常不是这样,原因很简单,因为您可以在不同的单曲面类别之间使用“可应用”的函子,而单子词(和共体)是内函子。 。
此外,Applicative
用强松散的单对偶函子进行标识会稍有误导,因为要证明名称(和的类型签名(<*>)
)合理,就需要在封闭的单对分类别之间使用一个函子,该函子既保留了单对分的结构又保留了内部hom。可以将其合理地称为“松散封闭的单曲面仿函数”,除了在单曲面封闭类别之间保留一个属性的函子以明显的方式保留另一个。因为Applicative
上仅描述endofunctors Hask保留的monoidal结构(,)
,它的实例自动获得了很多的特性,包括它们的强度,其可以因此被省略。
与之的明显联系Monad
可以说是一种隐含的限制Applicative
因素的假象,该隐含的限制因素是使它们各自的类半同体结构的各方面重合,这是一个不幸的巧合,不幸的是,这种巧合不能在二元化中幸存。
就像类别上的共鸣是上的monad一样,欧普拉单极子函子是松散单极子函子。但是不是单角封闭的,并且不包含函数应用程序的co- 几乎不值得使用该名称。无论如何,结果不会很有趣: Applicative
class (Functor f) => CoMonoidal f where
counit :: f () -> ()
cozip :: f (a, b) -> (f a, f b)
相反,我们可以想象一个“可乐封闭函子”的概念,Applicative
如果它存在的话,它将看起来更像是。不幸的是,不是(据我所知)在所有封闭的类别:在对应的态射在,但不能在那里用作内部指针-因为箭头相反,因此需要某种协同功能,而对于,我们通常无法定义该功能。newtype Op b a = Op (a -> b)
Op b a
如果我们简单地假装存在“可折叠封闭函子” ,并且以我们天真的希望它们的方式工作,那么基于此的联合可能看起来像这样:Applicative
class (Functor f) => CoApplicative f where
copure :: f a -> a
coap :: (f a -> f b) -> f (a -> b)
添加duplicate :: f a -> f (f a)
到copure
会产生comonad(假设法律均满足),当然。但无论如何,与之间coap
都没有明显的关系extend :: (f a -> b) -> f a -> f b
。通过比较这些类型,可以清楚地看出二元化是以不同的方式发生的:位于下方的duplicate
,cozip
与彼此或与coap
它们几乎没有关系(无论如何都没有意义)的共形结构,而liftA2 (,)
和(<*>)
是等效的,可以从派生join
。
Applicative
对偶化的另一种可能的方式(与共形关系更小)是考虑对立的单向子函子:
class (Contravariant f) => ContraMonoidal f where
contraunit :: f a
contrazip :: f a -> f b -> f (Either a b)
但这违反了与上述相同的问题,即不是封闭类别。如果是这样,我们就会有某种类型,使得像我们可以写功能和预期等实际工作。b <~ a
contracurry :: (Either c b <~ a) -> (c <~ (b <~ a))
contraapply :: b -> Either a (a <~ b)
如果对我,这里的障碍不是Haskell特有的,而是处于笛卡尔封闭状态(当然,是通常的手动挥舞)引起的,该属性与大多数类型的lambda结石共享,因此在大多数设置下,您不太可能走得太远。CoApplicative
但是,在更容易接受二元化的单面封闭类别中,您可能会有更好的运气。特别是,我认为两者Kleisli (Cont r)
及其对立的范畴都是封闭的,因此可能是探索这些思想的更好背景。
在SO的这篇文章中,我发现了一个有趣的答案决定性函子。如果我们更换()
的Void
,(,)
由Either
和反向的箭头,我们得到:
class Functor f => Decisive f where
nogood :: f Void -> Void
orwell :: f (Either s t) -> Either (f s) (f t)
博客文章还给出了决定性函子必须遵守的一些法律。
而且,每个Comonad
也是Decisive
:
instance Comonad c => Decisive c where
nogood = counit
orwell story = case counit story of
Left s -> fmap (either id (const s)) story
Right t -> fmap (either (const t) id) story
因此,决定性函子适合于函子和共性之间,就像应用函子适合于函子和单子之间。
麦克布赖德和帕特森(McBride and Patterson)(第7节)表明,一种应用函子(也称为成语)是一种强力的松散单曲面函子。您正在寻找一种强大的colax单向仿函数,也被称为一个强大的oplax单向仿函数。正如评论中提到的那样,欧普拉单等函子是相反类别之间的宽松单等函子,最终成为宽松单等函子的共形形式。
绘制图表,反向箭头!
我必须花一些时间来详细研究细节,以了解它的实质并将其转换为功能性编程概念。