2011-08-09 3 views
15

Applicative없이 pure이 없거나 Monad과 같은 것이 있지만 return이없는 경우가 종종 있습니다. semigroupoid 패키지는 이러한 경우를 ApplyBind으로 처리합니다. 이제는 Arrow에 관한 비슷한 상황에 있는데, 여기서 의미있는 arr 함수를 정의 할 수는 없지만 다른 함수는 완벽하게 이해할 수 있다고 생각합니다. 카테고리와 화살표 사이의 유형 클래스가 의미가 있습니까?

나는 기능을 보유하고 유형을 정의하고 그 역 기능입니다 : 내가 구현할 수 없다고 생각

--"Ow" is an "Arrow" without "arr" 
class Category a => Ow a where 
    first :: a b c -> a (b,d) (c,d) 
    first f = stars f Control.Category.id 

    second :: a b c -> a (d,b) (d,c) 
    second f = stars Control.Category.id f 

    --same as (***) 
    stars :: a b c -> a b' c' -> a (b,b') (c,c') 

... 
import Control.Arrow 

instance Ow Rev where 
    stars (Rev f f') (Rev g g') = Rev (f *** g) (f' *** g') 

:

이제
import Control.Category 

data Rev a b = Rev (a -> b) (b -> a) 

reverse (Rev f g) = Rev g f 
apply (Rev f _) x = f x 
applyReverse (Rev _ g) y = g y 
compose (Rev f f') (Rev g g') = Rev ((Prelude..) f g) ((Prelude..) g' f') 

instance Category Rev where 
    id = Rev Prelude.id Prelude.id 
    (.) x y = compose x y 

내가 구현할 수 없습니다 Arrow하지만, 약한 뭔가 &&&의 등가물은 f &&& g = arr (\b -> (b,b)) >>> f *** g으로 정의되고 (\b -> (b,b))은 되돌릴 수 없습니다. 아직도,이 약한 타입 클래스가 유용 할 수 있다고 생각합니까? 그것은 심지어 이론적 인 관점에서 이해가 되는가?

+0

'화살표'가 카테고리의 정의와 정확히 일치하지 않습니까? –

+0

아니요, '카테고리'기능은 카테고리의 정의입니다. 어쨌든 (변종이 아니더라도) 변종은 - 나는 그것을 이해합니다. '범주'는 같은 대상 (모든 유형)을 가지고 있지만 변이가 다른 ** 하스 **의 하위 범주에 해당합니다. 'Arrow'는 더 많은 구조체를 추가하지만 어떤 종류의 구조체에 대해 말할 지 모르겠다. –

+0

@Antal S-Z : 실제로 하위 카테고리가 아닙니다. 'Category'는 객체가 ** Hask ** 인 객체를 가진 카테고리를 지정합니다.이 카테고리는 2-ary 타입 생성자에 의해 주어진 화살표가 있습니다. 'Functor'는 ** Hask **의 하위 범주를 설명하며, 화살표는 ** Hask **의 화살표이고, 하나의 1-ary 유형 생성자에 의해 주어진 객체를 가지고 있습니다. 'Applicative'는'(,)'의 monoidal 구조를'Functor'에 매핑하는 반면'(&&&)'등은'Category'에 매핑합니다. 그리고'arr'은 ** Hask **에서'Category'까지 펑터를 제공합니다. –

답변

9

이 방법을 탐구 한 "이 백은 다시 : 화살표가 반전 프로그래밍"당신이로 실행중인 정확하게 이유 http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.153.9383

,이 포착되지 않은 잘못된 접근으로 밝혀졌다 더 넓게. 좀 더 최근에, Tillmann Rendel은가 로우 (http://www.informatik.uni-marburg.de/~rendel/rendel10invertible.pdf)에 대한 부분 동형을 대체 한 역전 문법에 대한 유쾌한 접근법을 만들었습니다. 이것은 사람들이 사용하고 놀 수있는 해킹 패키지로 꾸며져 있습니다. http://hackage.haskell.org/package/invertible-syntax

즉, arr이없는 화살표는 어느 정도 의미가 있다고 생각합니다. 나는 그런 것들이 가역 함수를 포착하기위한 적절한 수단이라고 생각하지 않는다.

편집 : Adam Megacz의 Generalized Arrows (http://www.cs.berkeley.edu/~megacz/garrows/)도 있습니다. 이것들은 반전 가능 프로그래밍에도 유용하지 않지만 (기본 typeclass는 반전 될 수 있지만) arr이 너무 강하지 만 다른 화살표 연산이 의미있는 다른 상황에서 사용합니다.

8

유형 이론 관점에서 Category 유형 클래스는 유형 생성자에 의해 하스켈에서 화살표를 직접적으로 설명 할 수있는 카테고리를 설명합니다. 새로운 프리미티브 화살표 또는 화살표 작성 함수의 형태로이 위에 빌드하려는 거의 모든 추가 기능은 전체 기능을 사용하여 구현할 수있는 경우 어느 정도 의미가 있습니다. 유일한주의 사항은 표현력을 추가하면 다른 요구 사항을 깰 수 있다는 것입니다. 종종 arr에서 발생합니다.

가역 함수의 구체적인 예는 모든 화살표가 동형 인 범주를 설명합니다. 완전히 그리고 완전히 기대되는 충격적인 트위스트에서 Edward Kmett는 이미 Hackage에 an implementation of this을 가지고 있습니다.

arr 함수는 대략 하스켈 함수에서 Arrow 인스턴스로의 functor (카테고리 이론적 의미에서)에 해당하며 객체 (예 : 유형 매개 변수)는 동일하게 남겨 둡니다. 단순히 arrArrow에서 제거하면 ... arr fstarr snd 등가물을 프리미티브로 추가하지 않고서는별로 유용하지 않은 다른 것을 얻을 수 있습니다.

나는 당신에게, 이론적 인 관점에서 절대적으로 합리적이다 products와 범주를 줄뿐만 아니라,되고 안, (&&&)과 함께 fstsnd에 대한 기본 요소를 추가하는 것은 두 개의 입력에서 새 화살표를 구축 할 수 있다고 생각 발견 한 이유로 인버트 화살표와 호환됩니다.

+0

'Rev' (또는'Iso')에'&&&'를 쓰는 법칙은 없습니다. 왜 묻는거야? 'b -> a '와'c -> a'는'(b, c) -> a'를 얻을 방법이 없으므로'a-> b'와'a-> c'가 * 둘은 원래 'b'와'c'를 되돌려 줄 것을 보장합니다. – sclv

+0

마찬가지로, Iso에 대해서도 적절한'fst'와'snd'를 쓸 수 없습니다! (a, b) -> a의 역은 무엇입니까? 이것이 부분 동형이 필요한 이유입니다. 물론 '첫 번째'와 '두 번째'를 쓸 수는 있습니다. – sclv

+0

@sclv : 네. 사실,'(***)'과'(+++)'둘 다 괜찮을뿐만 아니라, 제품/합계 유형의 연관성, 교환 성 및 분배 성질을 제공하는 함수가되어야합니다. 그러나'(&&&)'와'(|||)'는 일반적인 경우에는 작동하지 않습니다. –

관련 문제