2016-06-06 2 views
5

MacLane, Awodey 및 Spivak 서적을 기반으로 카테고리 이론을 연구 한 후, 하스켈에서 무료/운영 모나드를 이해하려고합니다.Coyoneda와 Haskell의 Functor 파생

Control.Monad.Free을 사용하여 모나드를 얻을 수 있습니다.이 모나드는 Yoneda lemma라는 수학적 배경을 기반으로하는 Data.Functor.Coyoneda 인 Functor로 변환 한 후 사용할 수 있습니다.

하지만 요 네다 보조 정리에 의존하지 않고 GHC에서 파생 함수를 확장하여 파생자가 자동 ​​생성 될 수 있다는 것을 완전히 이해하지 못했습니다.

GHC에서 유도 펑터를 사용하는 데 제한이 있습니까? Data.Functor.Coyoneda과 비교하면 어떻습니까?

+0

아마도 [this blogpost] (https://oleksandrmanzyuk.wordpress.com/2013/01/18/co-yoneda-lemma/)가 도움이 될 것입니다. – Carsten

답변

8

좋은 질문입니다!

CoyonedaDeriveFunctor은 다른 작업을 수행합니다. Coyoneda은 임의의 인수 선택에 대해 Functor 인 새로운 데이터 유형을 새로 만듭니다. DeriveFunctor이 자동으로 인 유형에 대한 상용구 코드를 생성합니다. 이러한 인스턴스를 수동으로 작성할 수있는 유형의 경우에만 Functor 인스턴스를 파생시킬 수 있습니다.

는 (다소 인위적인) 예를 들어 newtype Pred a = Pred (a -> Bool)을 가지고 : 더 instance Functor Preda 매개 변수 contravariant입니다 Pred 때문에, 그래서 DeriveFunctor 당신을 도울 수 없습니다되지 않습니다있다. 반면에 Coyoneda Pred은 어떤 f에 대해서도 Coyoneda f이 매우 유용하지는 않지만 Functor이기 때문에 Functor입니다.

또한, Freer monadFree 내지 Coyoneda의 응용으로 발생한다.

+0

'Coyoneda Pred'는 어떤면에서 거의 같은 동형 또는 동등한 것입니까? Const()에? 당신은 그들 중 어떤 정보도 추출해서는 안됩니다 ... – chi

+1

@chi 그래, 그렇 겠지. 실재로 정량화 된'b' 형태의'Void'를 선택하여 무의미한'Coyoneda Pred'를 만들 수 있습니다 :'Coyoneda absurd absurd :: forall a. Coyoneda Pred a'. 그런 다음 동형의 두 방향을 모두 구성하는 것이 사소한 일입니다. –

+0

@BenjaminHodgson 'StandaloneDeriving'과 함께'DeriveFunctor '를 사용하면 일반적인 데이터 유형이'Coyoneda '의 힘을 빌리지 않고 펑터가 될 수있는 것 같습니다. 맞습니까? 나는 Freer Monad의 이름을 알고 있지만 아직 완전히 이해하지는 못했다. – sato