Applicative
없이 pure
이 없거나 Monad
과 같은 것이 있지만 return
이없는 경우가 종종 있습니다. semigroupoid 패키지는 이러한 경우를 Apply
및 Bind
으로 처리합니다. 이제는 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))
은 되돌릴 수 없습니다. 아직도,이 약한 타입 클래스가 유용 할 수 있다고 생각합니까? 그것은 심지어 이론적 인 관점에서 이해가 되는가?
'화살표'가 카테고리의 정의와 정확히 일치하지 않습니까? –
아니요, '카테고리'기능은 카테고리의 정의입니다. 어쨌든 (변종이 아니더라도) 변종은 - 나는 그것을 이해합니다. '범주'는 같은 대상 (모든 유형)을 가지고 있지만 변이가 다른 ** 하스 **의 하위 범주에 해당합니다. 'Arrow'는 더 많은 구조체를 추가하지만 어떤 종류의 구조체에 대해 말할 지 모르겠다. –
@Antal S-Z : 실제로 하위 카테고리가 아닙니다. 'Category'는 객체가 ** Hask ** 인 객체를 가진 카테고리를 지정합니다.이 카테고리는 2-ary 타입 생성자에 의해 주어진 화살표가 있습니다. 'Functor'는 ** Hask **의 하위 범주를 설명하며, 화살표는 ** Hask **의 화살표이고, 하나의 1-ary 유형 생성자에 의해 주어진 객체를 가지고 있습니다. 'Applicative'는'(,)'의 monoidal 구조를'Functor'에 매핑하는 반면'(&&&)'등은'Category'에 매핑합니다. 그리고'arr'은 ** Hask **에서'Category'까지 펑터를 제공합니다. –