在共母和函子之间是否存在类似共同应用函子的概念?


17

任何monad也是可应用的函子,任何可应用的函子都是函子。另外,任何comonad都是函子。在共模函子和函子之间是否有类似的概念,例如共应用函子,它的特性是什么?

函子函子适用函子单音科莫纳兹

更新:我也对这种概念的可能用途感兴趣。


您确定不是要寻找Comonads-> ???吗?->伙计们?
josiah's

1
@josiah不,据我所知,comonads是函子,而不是cofunctors。
PetrPudlák'16

1
难道无法将那片丢失的东西整除吗?
Gus

Answers:


15

首先:

任何monad也是可应用的函子,任何可应用的函子都是函子。

在Haskell的情况下,这是正确的,但是(读Applicative作“强松散单极子函子”)通常不是这样,原因很简单,因为您可以在不同的单曲面类别之间使用“可应用”的函子,而单子词(和共体)是内函子。 。

此外,Applicative用强松散的单对偶函子进行标识会稍有误导,因为要证明名称(和的类型签名(<*>))合理,就需要在封闭的单对分类别之间使用一个函子,该函子既保留了单对分的结构又保留了内部hom。可以将其合理地称为“松散封闭的单曲面仿函数”,除了在单曲面封闭类别之间保留一个属性的函子以明显的方式保留另一个。因为Applicative上仅描述endofunctors Hask保留的monoidal结构(,),它的实例自动获得了很多的特性,包括它们的强度,其可以因此被省略。

与之的明显联系Monad可以说是一种隐含的限制Applicative因素的假象,该隐含的限制因素是使它们各自的类半同体结构的各方面重合,这是一个不幸的巧合,不幸的是,这种巧合不能在二元化中幸存。

就像类别上的共鸣是上的monad一样,欧普拉单极子函子是松散单极子函子。但是不是单角封闭的,并且不包含函数应用程序的co- 几乎不值得使用该名称。无论如何,结果不会很有趣:CCØp CdCØpdØpH一种sķØpApplicative

class (Functor f) => CoMonoidal f where
    counit :: f () -> ()
    cozip :: f (a, b) -> (f a, f b)

相反,我们可以想象一个“可乐封闭函子”的概念,Applicative如果它存在的话,它将看起来更像是。不幸的是,不是(据我所知)在所有封闭的类别:在对应的态射在,但不能在那里用作内部指针-因为箭头相反,因此需要某种协同功能,而对于,我们通常无法定义该功能。H一种sķØpnewtype Op b a = Op (a -> b)H一种sķb一种H一种sķØpOp b aH一种sķ

如果我们简单地假装存在“可折叠封闭函子” ,并且以我们天真的希望它们的方式工作,那么基于此的联合可能看起来像这样:H一种sķ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。通过比较这些类型,可以清楚地看出二元化是以不同的方式发生的:位于下方的duplicatecozip与彼此或与coap它们几乎没有关系(无论如何都没有意义)的共形结构,而liftA2 (,)(<*>)是等效的,可以从派生join

Applicative对偶化的另一种可能的方式(与共形关系更小)是考虑对立的单向子函子:

class (Contravariant f) => ContraMonoidal f where
    contraunit :: f a
    contrazip :: f a -> f b -> f (Either a b)

但这违反了与上述相同的问题,即不是封闭类别。如果是这样,我们就会有某种类型,使得像我们可以写功能和预期等实际工作。H一种sķØpb <~ acontracurry :: (Either c b <~ a) -> (c <~ (b <~ a))contraapply :: b -> Either a (a <~ b)

如果对我,这里的障碍不是Haskell特有的,而是处于笛卡尔封闭状态(当然,是通常的手动挥舞)引起的,该属性与大多数类型的lambda结石共享,因此在大多数设置下,您不太可能走得太远。H一种sķCoApplicative

但是,在更容易接受二元化的单面封闭类别中,您可能会有更好的运气。特别是,我认为两者Kleisli (Cont r)及其对立的范畴都是封闭的,因此可能是探索这些思想的更好背景。


将您的答案与cstheory.stackexchange.com/a/22302/989进行比较,令人惊讶的是,您没有将乘积与求和二元化。当然,Hask没有分类总和是正确的。但是,如果您愿意限制总程序的类别(例如在Agda中),让我们假装现在设置,该问题就会消失。(我不是说Set ^ op是单曲面封闭的,但我怀疑我的意思暗含了它)。
Blaisorblade

8

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 

因此,决定性函子适合于函子和共性之间,就像应用函子适合于函子和单子之间。


6

麦克布赖德和帕特森McBride and Patterson)(第7节)表明,一种应用函子(也称为成语)是一种强力的松散单曲面函子。您正在寻找一种强大的colax单向仿函数,也被称为一个强大的oplax单向仿函数。正如评论中提到的那样,欧普拉单等函子是相反类别之间的宽松单等函子,最终成为宽松单等函子的共形形式。

绘制图表,反向箭头!

我必须花一些时间来详细研究细节,以了解它的实质并将其转换为功能性编程概念。


出于某种原因,标准术语似乎是“ oplax单面仿函数”。这个想法是在相对类别之间的松散单曲面函子,最终是松散单曲面函子的共形形式。使用“ colax comonoidal”是多余的,或者等效于“ lax monoidal”。
CA McCann

我夸大了“合作”。我会解决我的答案。
戴夫·克拉克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.