2016-11-21 16 views
6

우리가 KleisliFunctor를 정의 할 수 있습니다 방법입니다KleisliFunctor와 비슷한 점은 무엇입니까? 여기

class (Monad m, Functor f) => KleisliFunctor m f where 
    kmap :: (a -> m b) -> f a -> f b 
    kmap f = kjoin . fmap f 

    kjoin :: f (m a) -> f a 
    kjoin = kmap id 

합니까

class (Functor f, Monad m) => Absorb f m where 
    (>>~) :: f a -> (a -> m b) -> m b 
    a >>~ f = ajoin $ fmap f a 

    ajoin :: f (m a) -> m a 
    ajoin a = a >>~ id 

적합 어딘가에 카테고리 이론으로 이러한 유형의 클래스? 법은 무엇입니까? 그들은 있습니까

a >>~ g . f  === fmap f a >>~ g 
a >>~ (f >=> g) === a >>~ f >>= g 

?

+0

'Absorb' 인스턴스는 허용하지만 충분히 강력한 표준 인스턴스는'(>> ~)'와'ajoin'을 구현할 수있는 특정 예제 유형이 있습니까? – leftaroundabout

+0

@leftaround에 대해서는,'f' 펑터에 누적기를 유지하면서 결과를'm' 모나드로 반환 할 수있는 일반화 된 모다 딩 접기를 구현하려면'Absorb'가 필요합니다. 예 : [this] (https://github.com/effectfully/prefolds/blob/374257b12f9a2af752862addafe456cded9c0efb/test/Main.hs#L297). – user3237465

답변

4

이것은 추측적인 대답입니다. 조심해서 진행해라.

하자 먼저 바인드 같은 화살표지도에 초점을 KleisliFunctor을 고려해 관련을 따라 Hask, kmap에 실제로 m의 Kleisli 카테고리에서 펑 일이 들어

class (Monad m, Functor f) => KleisliFunctor m f where 
    kmap :: (a -> m b) -> f a -> f b 

있다 펑 법 :

-- Mapping the identity gives identity (in the other category). 
kmap return = id 
-- Mapping a composed arrow gives a composed arrow (in the other category). 
kmap (g <=< f) = kmap g . kmap f 

사실 관련이 개 Functor의 물건이 조금 이상한, B가하게 있음 예를 들어, 법률은 mapMaybe에 대한 보류를합니다. 이는 KleisliFunctor이 언급 한 첫 번째 구체 예입니다. 즉시 발생 질문 카테고리 기능을 가지고 것이다 것입니다

class (Functor f, Monad m) => Absorb f m where 
    (~<<) :: (a -> m b) -> f a -> m b 

우리가 KleisliFunctor 유사한 무언가를 찾고 있다면, : Absorb에 관해서는

, 나는 명확성을 위해 바인드 같은 방법을 플립합니다 유형은 f a -> m b이고 화살표로 표시됩니다. 그것은 확실하게 Hask 일 수 없으며 그 신분 (유형이 f a -> m a 임)은 id 일 수 없습니다. 우리는 정체성뿐만 아니라 구성도 알아 내야 할 것입니다. Monad 달리 완전히없는 뭔가 ...

idAbsorb :: f a -> m a 
compAbsorb :: (f b -> m c) -> (f a -> m b) -> (f a -> m c) 

을 위해 ... 지금 내가 생각할 수있는 유일한 그럴듯한 것은 idAbsorb으로 모나드 morphism에를 가지고 있으며 (그 반대 방향으로 두 번째 모나드 morphism에를 사용하여 가 m에서 f까지이므로 compAbsorb은 첫 번째 함수를 적용한 다음 f으로 돌아가서 마지막으로 두 번째 함수를 적용하여 구현할 수 있습니다. 제 가정이 적절한지,이 접근 방식이 효과가 있는지, 그리고 그것이 귀하의 목적에 도움이되는 어떤 것을 유도 하는지를 확인하기 위해서는 그것을 해결해야합니다.

+0

"카테고리는'fa -> mb' 타입의 기능을 화살표로 가질 것입니다. - 나는 화살표에 대해서는 알지 못하지만,'Hask'의 두 endofunctor의 쉼표 카테고리에있는 이러한 객체는 아닙니다 :'f'와' m? 그래도 우리에게 어떤 생각이 들지는 않습니다.'compAbsorb'는 저에게 매우 만족스럽지 않습니다. 하나는,'fb -> mc'가 모나드 모프 즘이되기를 원하지 않습니다. 왜냐하면'f'가 다소 모범적 인 모나드 인스턴스를 가지고 있기 때문입니다. 질문에서)'m'에서'f'로 갈 필요가 없으며 나는 그것을 강요하고 싶지 않습니다. 대답 주셔서 감사합니다, 그것은 내게 몇 가지를 명확하게했습니다. – user3237465

+1

@ user3237465 코드를 보면 기대를 확인하는 것 같습니다. 특히,'idAbsorb = slift'와'compAbsorb = g '를 시도하여 "명백한"일을하려고합니다. runDriveT. f'는 첫 번째 장애물에 해당한다 -'compAbsorb idAbsorb f'는'f'가 아니다 ('Stop'을'More'로 바꾼다). 그래서 카테고리도 없다. 'DriveT m'에서'm'으로가는 것은 문제를 일으키며, 말하자면, 유스 케이스의 구성 과정에서 그렇게하는 것은 거의 의미가 없습니다. 그건 그렇고,'(> ~>)'이'(> =>)도 아니고'flip compAbsorb'도 아니므로, 당신이 정말로 다른 것을 원한다는 것을 확인하는 것 같습니다. – duplode