모든 모나드는 또한 적용되는 functor이고 모든 적용되는 functor는 functor입니다. 또한, 모든 코모 나는 펀터입니다. 코 모나드와 펑터 사이에 유사한 개념이 있습니까? 공동 적용 펑터와 같은 것이 있으며 그 속성은 무엇입니까?
업데이트 : 나는 그러한 개념의 가능한 사용에 관심이 있습니다.
모든 모나드는 또한 적용되는 functor이고 모든 적용되는 functor는 functor입니다. 또한, 모든 코모 나는 펀터입니다. 코 모나드와 펑터 사이에 유사한 개념이 있습니까? 공동 적용 펑터와 같은 것이 있으며 그 속성은 무엇입니까?
업데이트 : 나는 그러한 개념의 가능한 사용에 관심이 있습니다.
답변:
가장 먼저:
모든 모나드는 또한 적용되는 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 P → D O P . 그러나 H는 S K O P는 monoidal되지 폐쇄 및 공동 하지 않는 장점이 거의 이름 기능 프로그램을 포함한다. 어쨌든 결과는 그리 흥미롭지 않을 것입니다. 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 Knewtype Op b a = Op (a -> b)
,하지만int로서 일을하지 않습니다 화살표가 뒤집혀 있기 때문에 대신 어떤 종류의 기능이 필요할 것이므로Hask에대해서는 일반적으로 정의 할 수 없습니다.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
. 는 이중화는 다른 방법으로 일어나고있는 것이 분명하게 유형을 비교하십시오 comonoidal 구조는 기본 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)
기억이 나에게 봉사한다면, 여기의 장애물은 하스켈에만 국한된 것이 아니라 오히려 CoApplicative
그러나, 이원화에 더 적합한 단일체 폐쇄 형 범주에서는 더 나은 운이있을 수 있습니다. 특히, 나는 Kleisli (Cont r)
그와 그 반대의 범주가 모두 단일체 폐쇄적 이라고 믿기 때문에 이러한 아이디어를 탐구하는 것이 더 나은 맥락 일 수 있습니다.
에서 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
따라서 결정형 펑 터는 펑터와 모나드 사이에 적용되는 것처럼 펑터와 코모 나 사이에 적합합니다.
McBride와 Patterson (섹션 7)은 관용구로도 알려진 관용 functor 가 강력한 lax monoidal functor 임을 보여줍니다 . 강력한 colax monoidal functor를 찾고 있습니다. 강력한 oplax의 monoidal 펑터 . 의견에서 언급했듯이, oplax monoidal functor는 반대 범주 사이의 lax monoidal functor입니다.
다이어그램을 그리고 화살표를 뒤집으십시오!
세부 정보를 확인하고 세부 정보를 확인하고 기능적 프로그래밍 개념으로 변환하는 데 약간의 시간이 필요했습니다.