코로나 드와 펑터 사이에 공-응용 펑터와 같은 개념이 있습니까?


17

모든 모나드는 또한 적용되는 functor이고 모든 적용되는 functor는 functor입니다. 또한, 모든 코모 나는 펀터입니다. 코 모나드와 펑터 사이에 유사한 개념이 있습니까? 공동 적용 펑터와 같은 것이 있으며 그 속성은 무엇입니까?

FunctorsFunctorsApplicative functors???MonadsComonads

업데이트 : 나는 그러한 개념의 가능한 사용에 관심이 있습니다.


당신이 코 모나드를 찾고 있지 않습니까-> ??? -> 보조 기능?
josiah

1
@josiah 아니요, 제가 아는 한, 코모 나는 코 펀터가 아닌 펑터 입니다.
Petr Pudlák

1
아닌가 나눌 조각 누락이?
거스

답변:


15

가장 먼저:

모든 모나드는 또한 적용되는 functor이고 모든 적용되는 functor는 functor입니다.

이것은 하스켈의 맥락에서 사실이지만, Applicative일반적으로 그렇지는 않지만 ( "강력한 일 축성 functor"라고 읽음), 모나드 (및 코 모나드)가 endofunctors 인 반면에 다른 일관된 범주 사이에 "적용 가능한"펑터를 가질 수있는 사소한 이유 때문에 .

또한, Applicative이름 (및 타입 시그니처 (<*>)) 을 정당화하기 위해서는 폐쇄 된 단일체 범주 사이 에서 단일체 구조내부 호모를 모두 보존하는 기능이 필요 하기 때문에 강력한 lax monoidal functors로 식별 하는 것은 약간 잘못된 것 입니다. 이것은 어느 한쪽의 속성을 보존하는 단일체 닫힌 범주 사이의 functor가 다른 하나를 명백한 방식으로 보존한다는 점을 제외하고는 "lax closed monoidal functor"라고 할 수있다 . 의 단일체 구조를 보존하는 Hask의Applicative endofunctor 만 설명 하기 때문에 인스턴스는 강도를 포함하여 많은 속성을 자동으로 얻습니다 .(,)

명백히 관련 은 그들의 각각의 모노 이드 구조의 측면이 일치하게하는 것에 Monad대한 암시 적 한계의 인공물이며, Applicative불행히도 이원화에서 살아남지 않는 행복한 우연의 일치이다.

카테고리에 comonad 것처럼 에 모나드 인 C O P는 , oplax monoidal 펑 C D가 느슨한 monoidal 펑 인 C O PD O P . 그러나 H는 S K O P는 monoidal되지 폐쇄 및 공동 하지 않는 장점이 거의 이름 기능 프로그램을 포함한다. 어쨌든 결과는 그리 흥미롭지 않을 것입니다.영형 영형영형H에스케이영형Applicative

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

대신 "colax closed functor"라는 개념을 상상할 수 Applicative있습니다. 불행히도, 폐쇄 카테고리 (본인이 아는) 전혀 아니다 : 에 H S K 대응 morphisms에 B 에서 H S KH에스케이영형newtype Op b a = Op (a -> b)H에스케이 ,하지만int로서 일을하지 않습니다 화살표가 뒤집혀 있기 때문에 대신 어떤 종류의 기능이 필요할 것이므로Hask에대해서는 일반적으로 정의 할 수 없습니다.H에스케이영형Op b aH에스케이

H에스케이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)copurecomonad 생산하는 것입니다 물론, (법칙을 가정하고 만족하고 있습니다). 그러나 어떤 coap것이 든 간에 -와는 분명한 관계가 없습니다 extend :: (f a -> b) -> f a -> f b. 는 이중화는 다른 방법으로 일어나고있는 것이 분명하게 유형을 비교하십시오 comonoidal 구조는 기본 duplicatecozip서로 또는과 거의가 coap(아마 어쨌든 이해가되지 않는)를, 반면 liftA2 (,)(<*>)동일으로부터 유도 할 수있다 join.

Applicative코 모나드와 관련이없는 이원화 의 또 다른 가능한 방법은 반 변형 일 측성 펑터를 고려하는 것입니다.

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

그러나 이것은 위와 동일한 문제, 즉 H에스케이영형b <~ acontracurry :: (Either c b <~ a) -> (c <~ (b <~ a))contraapply :: b -> Either a (a <~ b)

기억이 나에게 봉사한다면, 여기의 장애물은 하스켈에만 국한된 것이 아니라 오히려 H에스케이CoApplicative

그러나, 이원화에 더 적합한 단일체 폐쇄 형 범주에서는 더 나은 운이있을 수 있습니다. 특히, 나는 Kleisli (Cont r)그와 그 반대의 범주가 모두 단일체 폐쇄적 이라고 믿기 때문에 이러한 아이디어를 탐구하는 것이 더 나은 맥락 일 수 있습니다.


cstheory.stackexchange.com/a/22302/989에 대한 답변을 비교하면 제품을 합계로 이중화하지 않는 것이 놀랍습니다. 물론 Hask에는 범주 합계가없는 것이 맞습니다. 그러나 전체 프로그램 범주 (Agda와 같은)로 제한하려는 경우 지금 설정되어 있다고 가정 해 봅시다. 문제가 사라집니다. (나는 Set ^ op이 일회성 폐쇄라고 말하지는 않지만 내가 말하는 것이 그것을 의미한다고 생각합니다).
Blaisorblade

8

에서 SO에이 게시물 - I 흥미로운 대답을 발견 결정적인 펑터 . 우리가 바꿀 경우 ()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와 Patterson (섹션 7)은 관용구로도 알려진 관용 functor강력한 lax monoidal functor 임을 보여줍니다 . 강력한 colax monoidal functor를 찾고 있습니다. 강력한 oplax의 monoidal 펑터 . 의견에서 언급했듯이, oplax monoidal functor는 반대 범주 사이의 lax monoidal functor입니다.

다이어그램을 그리고 화살표를 뒤집으십시오!

세부 정보를 확인하고 세부 정보를 확인하고 기능적 프로그래밍 개념으로 변환하는 데 약간의 시간이 필요했습니다.


어떤 이유로 표준 용어는 "oplax monoidal functor"로 보인다. 아이디어는 반대 범주 사이의 lax monoidal functor이며, 결국 lax monoidal functor의 comonoidal 버전입니다. "colax comonoidal"사용은 중복되거나 "lax monoidal"과 동일합니다.
CA McCann

나는 "공동"을 무시했다. 나는 대답을 고칠 것이다.
Dave Clarke
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.