Steve Awodey. Category Theory 읽기 PureScript 쓰기 [처음(?)・제2장]
23907 단어 PureScripttech
개시하다
이 글은 Steve Awodey의 Category Theory를 읽으면서 나온 개념을 PureScript로 구현한 것이다.
"처음(?)"책 중간부터 쓰고 싶어서 처음부터 쓴 게 아니에요
나는 지금도 보고 있기 때문에 지식이 없다. 나는 '모르면 쓸 수 없다' 는 정신에 따라 했는데, 아마도 잘못 썼을 것이다.
2.3
종결 대상 1에서 대상 A로 쏘는 1\rightarowa를 Points라고 한다. (의문점: 다른 문헌 중역이 반드시 1은 아니다. 용어의 차이는?)
집합 또는 반순으로 집합된 권내에는 사격 f:A\rightarowB와 g:A\rightarowB가 있고 모든pointsa:1은rightarowA에 대해 fcirca=g\circa가 쏘면 f와 g가 같다.
☆ 이것은 PureScript의 범위이다(Haskell의 경우는Hask이기 때문에Pure?)근데 성립된 거 아니에요?
그 전에 Pure의 구성이
Type
가 있는 유형https://myuon.github.io/posts/versus-hask-category/
Hask 동그라미가 안 되는 것 같아요.
퓨어스크립트는 정규 평가이기 때문에
call-by-need
문제가 없을 거예요. 그런데 undefined
에 대해서는 몰라요.하지만
FFI
를 배제한 퓨어스크립트는 없을 수도 있다undefined
. 앞으로 이 부분을 고려하고 싶다.☆로 돌아가면,
f :: A -> B
와 g :: A -> B
가 있고 임의a :: Unit -> A
가 (f <<< a) unit == (g <<< a) unit
일 때 임의e :: A
가 있다.되다
(함수
f e == g e
와 f
의 동일한 값을 모두g
의 e
로 정의한다f e == g e
.증명)
임의의
e :: A
인 경우 a = const e
인 경우 f e == (f <<< a) unit == (g <<< a) unit === g e
2.4
대상 A와 B의 적은 P와 p이다1:P\rightarrow A p_2:P\rightarowA, 그룹, 임의의 객체 X 및 x를 생성합니다.1:X\rightarrow A,x_2: X\rightarowB의 경우 고유 발사 u:X\rightarow P에 x 있음1 = p_1\circ u,x_2 = p_2\circu만족
이것1, x_쓰다
(고찰)'일반화 요소'의 사고방식을 사용한다면1은 A의 요소, x2는 B의 요소이고 u는 P의 요소이다. 다시 말하면
"A와 B의 직접적 축적 P는 A의 요소인 a와 B의 요소인 b에 대해 유일한 P의 요소인 p, a=p1(p), b=p2(p) 같은 P와 집합의 직접적 축적과 같은 표기법이 있어 상대방의 마음을 쉽게 이해할 수 있다(전혀 말이 안 될 수도 있다)
이것은 직적형과 좌우 각 값을 추출하는 함수에 대응한다.
data ProductT a b = Cons a b
p1 :: forall a b. ProductT a b -> a
p1 (Cons a _) = a
p2 :: forall a b. ProductT a b -> b
p2 (Cons _ b) = b
이것은 위의 정의를 만족시키면 다음과 같은 느낌으로 u를 생성하는 함수를 정의할 수 있다.genU :: forall x a b. (x -> a) -> (x -> b) -> x -> ProductT a b
genU x1 x2 x = Cons (x1 x) (x2 x)
모두에 대해 x :: X
x1 x == (p1 <<< genU x1 x2) x
및 x2 x == (p2 <<< genU x1 x2) x
그 전에 반드시 이런 함수가 유일하다고 말해야 한다고 할 수 있다.함수
genU
에 대해genU' :: forall x a b. (x -> a) -> (x -> b) -> x -> ProductT a b
및 x1 x == (p1 <<< genU' x1 x2) x
성립하면x2 x == (p2 <<< genU' x1 x2) x
및 x1 x == p1 (genU' x1 x2 x)
단, p1과 p2의 정의에서x2 x == p2 (genU' x1 x2 x)
genU' x1 x2 x = Cons (x1 x) (x2 x)
와 같기 때문에 유일합니다.또한 분류를 시도해 봅시다. a와 b의 임의의 직접적 사이에 동형사가 존재하기 때문에 아래의 종류를 준비할 수 있습니다.
class ProductC product a b | product -> a b where
toProductT :: product -> ProductT a b
fromProductT :: ProductT a b -> product
2.6
모든 개체 A, A'에 대해 C권 내에 개체 A\times A가 있는 경우
f:A\rightarow B와 f':A'\rightarow B', A와 A'의 직접적 축적 A\times A',p1:A×A'\rightarrow A, p_2:A×A'\rightarowa'에 대해 f\times f'=\langle f circp1, f'\circ p_2\rangle:A\times A'\rightarrow B\times B'
이렇게 하면
\times :C\times C\rightarrow C
닫다이 책은 정의되었습니까?
1_A\times 1_B=1_{A\times B}
A와 B의 직접적인 축적은 A\times B, p1:A\times B\rightarrow A,p_2:A\times B\rightarow B.
1_A\times 1_B=\langle 1_A\circ p_1, 1_A\circ p_2\rangle=\langle p_1, p_2\rangle
여기\langlep1, p_2\rangle은 u,p1=p_1\circ u,p_2=p_만족 2\circu, u의 유일성에 따라 u=1{A\times B}
f_1:A\rightarrow B,f_2:B\rightarrow C,g_1:P\rightarrow Q,g_2:Q\rightarowR(f 2\timesg 2)\circ(f 1\times 1)=(f 2\circf 1)\times(g 2\circg 1)
A와 P의 직접적 축적은 A\times P, p-A:A\times P\rightarrow A,p_A\times P\rightarow P로 가정합니다.
B\times Q, p-직선 BB:B\times Q\rightarrow B,p_Q:B\times Q\rightarow Q.
(f_2\times g_2)\circ (f_1\times g_1)=\langle f_2\circ p_B, g_2\circ p_Q\rangle\circ\langle f_1\circ p_A, g_1\circ p_P\rangle =\langle f_2\circ f_1\circ p_A, g_2\circ g_1\circ p_P\rangle = f_2\circ f_1\times g_2\circ g_1(고유성)
PureScript의 경우 에 해당
genU
ProductT
인스턴스가 됩니다.class Bifunctor f where
bimap :: forall a b c d. (a -> b) -> (c -> d) -> f a c -> f b d
instance Bifunctor ProductT where
bimap f g (Cons a b) = Cons (f a) (g b)
당연히 닫는 규칙을 만족시키지만, 먼저 확인해 보세요.bimap identity identity
== \(Cons a b) -> Cons a b
== identity
bimap f1 g1 <<< bimap f2 g2
== (\(Cons a b) -> Cons (f1 a) (g1 b)) <<< (\(Cons a b) -> Cons (f2 a) (g2 b))
== \(Cons a b) -> Cons (f1 <<< f2 $ a) (g1 <<< g2 $ b)
== bimap (f1 <<< f2) (g1 <<< g2)
2.7
객체 A, B, P 및 p1:P\rightarrow A,p_2:P\rightarow B, X
\vartheta _X:\rm{Hom}(X,P)\rightarrow\rm{Hom}(X,A)\times\rm{Hom}(X,B)
정의
\vartheta _X(x)=(p_1\circ x, p_2\circ x)
이때'P는 A와 B의 직적'과'임의의 X에 대해\vartheta X는 (집합 사이의 매핑으로) 같은 유형의 매핑'과 같다
Bifunctor
,Pure의 대상(이것은 CCC의 성질의 일부분인 것 같다https://scrapbox.io/mrsekut-p/CCC(저는 그렇게 생각하지만 틀과 집합은 그럴 듯하지만 그렇지 않다고 생각합니다.\rm{Hom}(X,P)정말
X -> P
인가요?이런 기분PureScript로 바꾸어 말하면 이렇다(?)
먼저 Vartheta(\vartheta) 클래스를 정의합니다.
class Vartheta product a b | product -> a b where
vartheta
:: forall x
. (x -> product)
-> ProductT (x -> a) (x -> b) --Productは集合の意味での直積として使っている
varthetaInv
:: forall x
. ProductT (x -> a) (x -> b)
-> (x -> product)
-- 条件: 型xが同じなら,vartheta <<< varthetaInv == identityかつvarthetaInv <<< vartheta == identity
모든 유형의 x에 대한\varthetax,\varthetax^{-1}이 있음을 나타냅니다 (\varthetax는 같은 종류의 맵이고 역맵이 같은 값입니다)또한 여기의
X -> P
형 변수는 product
와 a
의 직접적인 적을 필요로 하지 않는다.또한 모든 유형
b
에 대해 실례product
를 만들 때 하나의 유형x
이 존재한다.구성이 구체적이다.
instance Vartheta product a b => ProductC product a b where
toProductT p = Cons (a unit) (b unit)
where
Cons a b = vartheta (const p)
fromProductT (Cons a b) = varthetaInv (Cons (const a) (const b)) unit
instance ProductC product a b => Vartheta product a b where
vartheta = f
where
f p = Cons a b
where
a x = p1 $ toProductT (p x)
b x = p2 $ toProductT (p x)
varthetaInv = fInv
where
fInv (Cons a b) x = fromProductT $ Cons (a x) (b x)
닫기\rm{Hom}(X,-) 직선적 저장
PureScript로 바꾸어 말하면
유형
Vartheta product a b
,ProductC product a b
,a
에 대해 임의의 유형b
과 product
사이에 같은 사격이 있다.여기에는
ProductC product a b
의 임의x
사이에 같은 유형의 발사가 존재하기 때문에 임의의 유형x -> product
과 ProductC product2 (x -> a) (x -> b)
사이에 같은 유형의 발사가 존재한다는 뜻이다.구성이 구체적이다.
변하다
감상
시간이 많이 걸릴 줄은 몰랐어요. 계속 쓸 수 있을지 걱정이에요. 그리고 여러 가지 구체적인 예가 실린 2.5장과 연습문제는 모두 건너뛰었어요. 퓨어스크립트로 실시하고 싶은 내용이 있으면 부기에 쓰고 싶어요.
Reference
이 문제에 관하여(Steve Awodey. Category Theory 읽기 PureScript 쓰기 [처음(?)・제2장]), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/yukikurage/articles/59b056352446d6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)