2016-11-27 16 views
11

대신 뭔가 VectorSpace-y 또는 R2의 오히려 더 일반적인 짐승이 여기에 숨어 ​​수도 나에게 발생 유용한 표준 클래스 to this one바이 콤 노나드의 방법은 무엇입니까?

class Coordinate c where 
    createCoordinate :: x -> y -> c x y 
    getFirst :: c x y -> x 
    getSecond :: c x y -> y 
    addCoordinates :: (Num x, Num y) => c x y -> c x y -> c x y 

을 제안 무엇을 숙고하는 동안 : 그 두 포함 된 유형이 모두 추출 할 수있는 Type -> Type -> Type. 흠, 아마도 그들은 extract ed 일 수 있습니까?

comonad 또는 bifunctors 패키지에는 Bicomonad이라는 항목이 포함되어 있지 않습니다. 문제는, 그러한 수업은 이론적으로는 카테고리 이론적으로도 의미가 있습니까? 법률

fst . bidup ≡ id 
snd . bidup ≡ id 
bimap fst snd . bidup ≡ id 
bimap bidup bidup . bidup ≡ bidup . bidup 

와 아마

class Bifunctor c => Bicomonad c where 
    fst :: c x y -> x 
    snd :: c x y -> y 
    bidup :: c x y -> c (c x y) (c x y) 

하지만 난 그것을 찾을 : (도 정의되지 않으며, 정말 볼 수있는 방법을 볼 수있는) Bimonad 달리, 순진한 정의는 그럴듯하게 보인다 두 필드 모두 bidup에 동일한 유형이 포함되어 있음을 불안하게하고 다른 많은 "좋은"생각할 수있는 서명이 상당히 많이 있습니다.

의견이 있으십니까?

+2

답이 아닙니다. 그러나 ** endo ** 펑터의 카테고리에서 (공저) 모나드는 (텐서 곱으로 펑터 구성을 포함하고 있습니다) 맞습니까? Haskell bifunctors는 내과 의사가 아닙니다. 그래서 나는 진짜 bi (co) 모나드가 어떤 모습인지, 심지어 bifunctors 위에 그런 것을 만드는 것이 합리적이지도 모르겠다. 그러나 bicomonad와 "비슷하게"보일만한 유용한 무언가가있을 수 있으므로 여전히 흥미로운 질문입니다. –

답변

1

이것은 답변이 아니지만 Bimonad의 경우 어때요?

class Biapplicative p => Bimonad p where 
    (>>==) :: p a b -> (a -> b -> p c d) -> p c d 

biap :: Bimonad p => p (a -> b) (c -> d) -> p a c -> p b d 
biap p q = p >>== \ab cd -> q >>== \a c -> bipure (ab a) (cd c) 

instance Bimonad (,) where 
    (a,b) >>== f = f a b 

이 절대적으로 원격으로 유용도/우 흥미, 또는 경우 나도 몰라,하지만 잘 하스켈 관점에서 냄새가 난다. 귀하의 Bicomonad 또는 이와 유사한 제품과 일치합니까?

+2

확실하지 않습니다. 이것은 터플 인수 (카레)에 제한된 일반'Monad '와 매우 비슷합니다. – leftaroundabout

+0

@leftaroundabout 동의 함. 당신의 bicomonad가 튜플 인수에 제한된 코 모네드와 다른 경우, 나는 궁금해합니다. – chi

+0

@leftaround에 대해서,'Biapplicative'에 대해서도 거의 사실입니다 ('Const'와 같은 지루한 펑터를 제외한다면)? – dfeuer