Share
Embed
Welcome to the "Parametricity" ðïž â Generic ã ãã© Specific ãªäžç â
ãã®ã¹ã©ã€ãã¯ã2026/07/12ã颿°åãŸã€ã 2026ãã§çºè¡šãããã®ã§ãã
cf. https://fortee.jp/2026fp-matsuri/proposal/310a9a71-f65b-4ad1-a6d6-81878923cfb3
TAKASE Kazuyuki
July 12, 2026
Transcript
65 slides
-
Welcome to the "Parametricity" ðïž â Generic ã ãã© Specific ãªäžç
â #颿°åãŸã€ã 2026 â @Guvalif (TAKASE Kazuyuki) -
èªå·±çŽ¹ä» - é«ç¬ åä¹ (TAKASE Kazuyuki) ðïŒ@Guvalif äœè«) ScalaMatsuri 2020
ã¶ãã®ç»å£ã§ã ðª Profile { works = [ "IoT ãšã³ãžãã¢", "ããã³ããšã³ãã»ãšã³ãžãã¢", "éçºäººäº", "TechPM (â çŸè·)", "ãšã³ãžãã¢è²æ (â è€æ¥)" ], memo = "颿°å XXX ãåä¹ããã¡ ð" } -
å€çžåã®ã¢ãããŒã·ã§ã³ (1) é åã«å¯Ÿãã head 颿°ãèãã ãã å€çžåãç¡ã å Žåãæ¬¡ã®ãããªããšãèµ·ããïŒ const headN:
(_: number[]) => number | undefined = (xs) => xs.at(0); const headS: (_: string[]) => string | undefined = (xs) => xs.at(0); const headB: (_: boolean[]) => boolean | undefined = (xs) => xs.at(0); // 以äžãåäžãªå®è£ ã§ãã£ãŠãååããšã«åºå¥ããªããã°ãªããªã ð -
å€çžåã®ã¢ãããŒã·ã§ã³ (2) å€çžåããã å Žåãæ¬¡ã®ããã«èšè¿°ã§ããïŒ const head: <T>(_: T[]) => T
| undefined = (xs) => xs.at(0); head([ 1, 2, 3 ]); // 1 head([ 'a', 'b', 'c' ]); // 'a' head([ true, false, true ]); // true head([]); // undefined // ä»»æã®å `T` ã«å¯ŸããŠã(åå®å šæ§ãä¿ã£ãŠ) åäžãªå®è£ ãçšããããšãã§ãã ðââïž -
æ¬åœã«ïŒ ð€ ããå T ããšã«åå²ãèš±ããšãå€ãªå®è£ ãèš±ãããã ãããçŽæçã«ã¯ããã®ãããªå®è£ ã¯ã§ããªãããã«ããã å€çžåã§åä»ããããå®è£ ã«å¯ŸããŠã æé»ã®ãã¡ã« ããå
T ã«äŸåããªã ããšãèããŠããã â å€çžåã§åä»ãããããšã§ãå®è£ ãéå®ããã ããšãå°ããã -
åæ æ¬è³æã§ã¯ã以äžã®åæã®ããšæ°åŠçãªã¢ãã«ãèããŠããïŒ (çŽ æŽãª) å ã éå ãšã¿ãªã çŽç²ãªé¢æ°ã®ã¿ãèæ ®ãã äžåç¹æŒç®å (ãããã
Y or Z ã³ã³ãããŒã¿) ã¯èæ ®ããªã type F<X, Y> = (_: (_: X) => Y) => (_: X) => Y; type G<X, Y> = (_: G<X, Y> ) => (_: X) => Y; const Z = <X, Y>(f: F<X, Y>) => ( (g: G<X, Y>) => f((x) => g(g)(x)) ) ( (g: G<X, Y>) => f((x) => g(g)(x)) ); -
å°å ¥ïŒå€çžåã®è¡šçŸ å€çžåã§åä»ããããå€ã¯ (ãã«ã) ã§åºå¥ããããã®ãšãïŒ 1. éåžžã® TypeScript ã«ãããåè¡šçŸ â ~
â â â â h ~ h ~ â h ~ A : : : âšTâ©(_ : T[]) â T ⣠undefined âšTâ©. T[] â T ⣠undefined âšA/Tâ©. A[] â A ⣠undefined (1) (2) (3) -
å°å ¥ïŒå€çžåã®è¡šçŸ å€çžåã§åä»ããããå€ã¯ (ãã«ã) ã§åºå¥ããããã®ãšãïŒ 1. éåžžã® TypeScript ã«ãããåè¡šçŸ 2. åŒæ°ãçåããå衚çŸ
(æ¬è³æã§ã¯äžè²«ããŠãã®å衚çŸãæ¡çš) â ~ â â â â h ~ h ~ â h ~ A : : : âšTâ©(_ : T[]) â T ⣠undefined âšTâ©. T[] â T ⣠undefined âšA/Tâ©. A[] â A ⣠undefined (1) (2) (3) -
å°å ¥ïŒå€çžåã®è¡šçŸ å€çžåã§åä»ããããå€ã¯ (ãã«ã) ã§åºå¥ããããã®ãšãïŒ 2. åŒæ°ãçåããåè¡šçŸ (æ¬è³æã§ã¯äžè²«ããŠãã®å衚çŸãæ¡çš) 3. ããå A
ã«ããå ·äœå â ~ â â â â h ~ h ~ â h ~ A : : : âšTâ©(_ : T[]) â T ⣠undefined âšTâ©. T[] â T ⣠undefined âšA/Tâ©. A[] â A ⣠undefined (1) (2) (3) â» â» å³å¯ã«ã¯ãå ·äœåããæç¹ã§åãã©ã¡ãŒã¿ <T> ã¯æ¶å»ãããŸã ( <A/T> ã¯èŠèŠçåºå¥ ) -
æ€èšïŒå€çžåã éå ã§ã¢ãã«åããïŒ ð€ åãéåãšã¿ãªãããšã¯çŽ æŽã ãã(e.g. boolean = ) ããå T
ããšã«åå²ããå®è£ ãæé€ããããªãïŒ {true, false} -
æ€èšïŒå€çžåã éå ã§ã¢ãã«åããïŒ ð€ åãéåãšã¿ãªãããšã¯çŽ æŽã ãã(e.g. boolean = ) ããå T
ããšã«åå²ããå®è£ ãæé€ããããªãïŒ e.g. ãèããïŒ åãã©ã¡ãŒã¿ ãåããããš ãã å®å® ã«å±ãã ä»»æã®éå ã«å¯Ÿããæäœ ãšããŠè§£éãã 颿°ã®å ããé 眮éå ãšããŠè§£éãã ããã§ãããå ã«ããå ·äœå ã¯ãæç颿°ä»¥å€ãå«ã¿ãã {true, false} âšTâ©. T â T âšTâ© U T T â T TT A AA -
æ¹éïŒå€çžåã é¢ä¿ ã§ã¢ãã«åããå¶çŽã匷ãã ãããã "é¢ä¿" ãšã¯ïŒ ãã«ã«ãç© ã®éšåéå ã®ããš ãœãããŠã§ã¢ã»ãšã³ãžãã¢çã«ã¯ã
2 Tuple ã®éãŸãã®ããš æ¬è³æã§ã¯ãé¢ä¿ãèãããšã ã§å²ã£ãŠè¡šã ã¯ã ã®éšåéåã§ããããšã衚ã A à B [[ X ]] : (A, B) â R [[ ]] (A, B) â R A à B -
æçé¢ä¿ åãé¢ä¿ã«æã¡äžããéã®ãèªæãªäŸã®ã²ãšã€ïŒ [[ I â ]] : T (T, T)
â = R {(t, t) ⣠t â T} â T -
æçé¢ä¿ åãé¢ä¿ã«æã¡äžããéã®ãèªæãªäŸã®ã²ãšã€ïŒ e.g. ã®æã¡äžãïŒ [[ I â ]] : T
(T, T) â = R {(t, t) ⣠t â T} â T boolean â â â [[ I â ]] boolean = = = â {(t, t) ⣠t â boolean} {(t, t) ⣠t â {true, false}} {(true, true), (false, false)} boolean -
æçé¢ä¿ åãé¢ä¿ã«æã¡äžããéã®ãèªæãªäŸã®ã²ãšã€ïŒ e.g. ã®æã¡äžãïŒ [[ I â ]] : T
(T, T) â = R {(t, t) ⣠t â T} â T boolean â â â [[ I â ]] boolean = = = â {(t, t) ⣠t â boolean} {(t, t) ⣠t â {true, false}} {(true, true), (false, false)} boolean -
æçé¢ä¿ åãé¢ä¿ã«æã¡äžããéã®ãèªæãªäŸã®ã²ãšã€ïŒ e.g. ã®æã¡äžãïŒ [[ I â ]] : T
(T, T) â = R {(t, t) ⣠t â T} â T boolean â â â [[ I â ]] boolean = = = â {(t, t) ⣠t â boolean} {(t, t) ⣠t â {true, false}} {(true, true), (false, false)} boolean -
æçé¢ä¿ åãé¢ä¿ã«æã¡äžããéã®ãèªæãªäŸã®ã²ãšã€ïŒ e.g. ã®æã¡äžãïŒ [[ I â ]] : T
(T, T) â = R {(t, t) ⣠t â T} â T boolean â â â [[ I â ]] boolean = = = â {(t, t) ⣠t â boolean} {(t, t) ⣠t â {true, false}} {(true, true), (false, false)} boolean -
é¢ä¿ãšããŠã®é¢æ° 颿° ã¯ãé¢ä¿ ã«æã¡äžããããšãã§ããïŒ f : X â Y [[
f ]] [[ f ]] : (X, Y) â = R {(x, â ) ⣠âY â f(x) x â X} -
é¢ä¿ãšããŠã®é¢æ° 颿° ã¯ãé¢ä¿ ã«æã¡äžããããšãã§ããïŒ e.g. not 颿° ã®æã¡äžãïŒ f :
X â Y [[ f ]] [[ f ]] : (X, Y) â = R {(x, â ) ⣠âY â f(x) x â X} ¬ : boolean â boolean â â â [[ ¬ ]] = = = {(x, ¬(x)) ⣠x â boolean} {(x, ¬(x)) ⣠x â {true, false}} {(true, false), (false, true)} -
é¢ä¿ãšããŠã®é¢æ° 颿° ã¯ãé¢ä¿ ã«æã¡äžããããšãã§ããïŒ e.g. not 颿° ã®æã¡äžãïŒ f :
X â Y [[ f ]] [[ f ]] : (X, Y) â = R {(x, â ) ⣠âY â f(x) x â X} ¬ : boolean â boolean â â â [[ ¬ ]] = = = {(x, ¬(x)) ⣠x â boolean} {(x, ¬(x)) ⣠x â {true, false}} {(true, false), (false, true)} -
é¢ä¿ãšããŠã®é¢æ° 颿° ã¯ãé¢ä¿ ã«æã¡äžããããšãã§ããïŒ e.g. not 颿° ã®æã¡äžãïŒ f :
X â Y [[ f ]] [[ f ]] : (X, Y) â = R {(x, â ) ⣠âY â f(x) x â X} ¬ : boolean â boolean â â â [[ ¬ ]] = = = {(x, ¬(x)) ⣠x â boolean} {(x, ¬(x)) ⣠x â {true, false}} {(true, false), (false, true)} -
ã¡ã¢ ðïŒé¢ä¿ã®è¡šçŸå 颿° ã®é¢ä¿ãžã®æã¡äžã ã¯ã 1 ã€ã®å ¥åã«å¯Ÿã㊠1 ã€ã®åºåãæã€è¡šçŸ ã«éå®ããã
äžæ¹ã é¢ä¿ 㯠ã®ä»»æã®éšåéåãªã®ã§ã 1 ã€ã®å ¥åã«å¯ŸããŠè€æ°ã®åºåãæã€è¡šçŸ ã蚱容ã§ãã f : X â Y [[ f ]] X à Y -
ã¡ã¢ ðïŒé¢ä¿ã®è¡šçŸå 颿° ã®é¢ä¿ãžã®æã¡äžã ã¯ã 1 ã€ã®å ¥åã«å¯Ÿã㊠1 ã€ã®åºåãæã€è¡šçŸ ã«éå®ããã
äžæ¹ã é¢ä¿ 㯠ã®ä»»æã®éšåéåãªã®ã§ã 1 ã€ã®å ¥åã«å¯ŸããŠè€æ°ã®åºåãæã€è¡šçŸ ã蚱容ã§ãã e.g. å¹³æ¹æ ¹ã®é¢ä¿ ã«ã€ããŠïŒ f : X â Y [[ f ]] X à Y [[ S ]] = {(x, y) ⣠x = y } 2 (4, 2) â [[ S ]] â§ (4, â2) â [[ S ]] -
颿°é¢ä¿ (1) 2 ã€ã®é¢ä¿ ãš ãçšããŠã 2 Tuple ã®åèŠçŽ ã颿° ãšãªããããªé¢ä¿ãå®çŸ©ã§ããïŒ
[[ X ]] : (X, X ) â â² R [[ Y ]] : (Y, Y ) â â² R [[ X ]] â R [[ Y ]] : (X â Y, X â Y ) â â² â² R (f, f ) â â â â { â² for all (x, x ) â² (f(x), f (x )) â² â² â â [[ X ]], [[ Y ]] } -
颿°é¢ä¿ (2) å ·äœäŸãšããŠã ãèããŠã¿ãïŒ ã 颿°é¢ä¿ãæºããã¹ãæ¡ä»¶ ã [[ I â
]] â boolean R [[ I â ]] 0â£1 â â â â for all ( â ) x=xâ² â» x, xâ² ( â ) f(x)=f (x ) â² â² â» â f(x), f (x ) â² â² â â [[ I â ]], boolean [[ I â ]] 0â£1 â» æçé¢ä¿ã«å«ãŸãã 2 Tuple ã¯ãåžžã«ç¬¬ 1 èŠçŽ ãšç¬¬ 2 èŠçŽ ãçãããã -
颿°é¢ä¿ (2) å ·äœäŸãšããŠã ãèããŠã¿ãïŒ ã 颿°é¢ä¿ãæºããã¹ãæ¡ä»¶ ã â 颿°ã®å€å»¶æ§ããã ãæºãã
2 Tuple ã®ã¿èããã°è¯ã [[ I â ]] â boolean R [[ I â ]] 0â£1 â â â â for all ( â ) x=xâ² â» x, xâ² ( â ) f(x)=f (x ) â² â² â» â f(x), f (x ) â² â² â â [[ I â ]], boolean [[ I â ]] 0â£1 f = fâ² â» æçé¢ä¿ã«å«ãŸãã 2 Tuple ã¯ãåžžã«ç¬¬ 1 èŠçŽ ãšç¬¬ 2 èŠçŽ ãçãããã -
颿°é¢ä¿ (3) ãã®äžã§ã 颿°ã®å ã®å€ ããã¹ãŠåæããïŒ boolean â 0â£1 const
c0: (_: boolean) => 0|1 = (_) => 0; const c1: (_: boolean) => 0|1 = (_) => 1; const n: (_: boolean) => 0|1 = (x) => Number(x) as 0|1; const u: (_: boolean) => 0|1 = (x) => Number(!x) as 0|1; -
颿°é¢ä¿ (4) æåŸã« ãæºãã 2 Tuple ãåæãããšã以äžãšãªãïŒ f = fâ²
[[ I â ]] â boolean R [[ I â ]] = 0â£1 {(c â , c â ), (c â , c â ), (n, n), (u, u)} 0 0 1 1 -
å šç§°é¢ä¿ (1) ããé¢ä¿ ã衚çŸã®ã©ããã«æã€é¢ä¿ãšãã ãã®äžã§ãé¢ä¿ ã«ã€ããŠ å šç§°éå ããããšãèããïŒ F([[ X
]]) [[ X ]] [[ X ]] âš[[ X ]]â©. F([[ X ]]) = ( â , â ) â â â â { f ~ f ~â² for all [[ X ]] ( â â , â â ) f ~ X f ~â² Xâ² : â (X, X ) â , â² R F([[ X ]]) } -
å šç§°é¢ä¿ (1) ããé¢ä¿ ã衚çŸã®ã©ããã«æã€é¢ä¿ãšãã ãã®äžã§ãé¢ä¿ ã«ã€ããŠ å šç§°éå ããããšãèããïŒ ããã§ã ã¯
ã§æ·»åã¥ããããéãŸãïŒ ã¯ ã§æ·»åã¥ããããéãŸããæå³ãã ãš ãåã§èãããšã å€çžåã§åä»ããããå€ ãšã¿ãªãã F([[ X ]]) [[ X ]] [[ X ]] âš[[ X ]]â©. F([[ X ]]) = ( â , â ) â â â â { f ~ f ~â² for all [[ X ]] ( â â , â â ) f ~ X f ~â² Xâ² : â (X, X ) â , â² R F([[ X ]]) } â f ~ X â f ~â² Xâ² X Xâ² -
å šç§°é¢ä¿ (2) å ·äœäŸãšããŠã ãèããŠã¿ãïŒ ã å šç§°é¢ä¿ãæºããã¹ãæ¡ä»¶ ã âš[[ X ]]â©.
[[ X ]] â â â â for all [[ X ]] ( â â , â â ) f ~ X f ~â² Xâ² : â (X, X ) â , â² R [[ X ]] -
å šç§°é¢ä¿ (2) å ·äœäŸãšããŠã ãèããŠã¿ãïŒ ã å šç§°é¢ä¿ãæºããã¹ãæ¡ä»¶ ã ããã§ãã©ã®ãã㪠㚠ã«å¯ŸããŠãã
空é¢ä¿ ãèæ ®ããå¿ èŠããã â è¿°èªãæºãããªã ð âš[[ X ]]â©. [[ X ]] â â â â for all [[ X ]] ( â â , â â ) f ~ X f ~â² Xâ² : â (X, X ) â , â² R [[ X ]] X Xâ² [[ â ]] : (X, X ) â â² R -
å šç§°é¢ä¿ (2) å ·äœäŸãšããŠã ãèããŠã¿ãïŒ ã å šç§°é¢ä¿ãæºããã¹ãæ¡ä»¶ ã ããã§ãã©ã®ãã㪠㚠ã«å¯ŸããŠãã
空é¢ä¿ ãèæ ®ããå¿ èŠããã â è¿°èªãæºãããªã ð â ãæºããããšã¯ããšãŠãå€§å€ ðµâð« âš[[ X ]]â©. [[ X ]] â â â â for all [[ X ]] ( â â , â â ) f ~ X f ~â² Xâ² : â (X, X ) â , â² R [[ X ]] X Xâ² [[ â ]] : (X, X ) â â² R for all [[ â ]] -
ãããŸã§ã®ãŸãšã 以äžãããããå®çŸ©ããç°¡åã«æ§è³ªã確ãããïŒ ç©ºé¢ä¿ æçé¢ä¿ é¢ä¿ãšããŠã®é¢æ° 颿°é¢ä¿ å šç§°é¢ä¿ (æ¬è³æã§ã¯åãæ±ããªãã) åèæç®ã§ã¯ çŽç©é¢ä¿
ã ãªã¹ãé¢ä¿ ãªã©ãèšèŒãããŠããã®ã§ãèå³ãããã°åç §ãŸã§ ð [[ â ]] [[ I â ]] T [[ f ]] [[ X ]] â R [[ Y ]] âš[[ X ]]â©. F([[ X ]]) -
Parametricity å€çžåãæã€åã·ã¹ãã ãèãã ããå€ ã®å ãããåž°çŽçã«å°åºã§ãã é¢ä¿ ã¯ã ãæºãã ã ç°¡åãªå ·äœäŸ
ã ã«é¢ããŠã ãæãç«ã€ â» t T [[ T ]] (t, t) â [[ T ]] â : t â true â T â boolean (true, true) â [[ I â ]] boolean â» åèæç®ã«ãããèšè¿°ã¯ "éããé " ã§ãããåç°å¢ãé©åã«èæ ®ããã°è§£æ¶å¯èœã§ã -
å®éã«è©ŠããŠã¿ã (1) (ã®å) ããã ãšããé¢ä¿ã åž°çŽçã«å°åºããäžã§ãæºããã¹ãæ¡ä»¶ãèããïŒ ã é¢ä¿ãæºããã¹ãæ¡ä»¶ ã â
: f ~ âšTâ©. T â T âš[[ T ]]â©. [[ T ]] â R [[ T ]] â â â â for all for all [[ T ]] (t, t ) â² ( â â (t), â â (t )) f ~ T f ~ Tâ² â² : â â (T, T ) â , â² R [[ T ]], [[ T ]] -
å®éã«è©ŠããŠã¿ã (1) (ã®å) ããã ãšããé¢ä¿ã åž°çŽçã«å°åºããäžã§ãæºããã¹ãæ¡ä»¶ãèããïŒ ã é¢ä¿ãæºããã¹ãæ¡ä»¶ ã â
: f ~ âšTâ©. T â T âš[[ T ]]â©. [[ T ]] â R [[ T ]] â â â â for all for all [[ T ]] (t, t ) â² ( â â (t), â â (t )) f ~ T f ~ Tâ² â² : â â (T, T ) â , â² R [[ T ]], [[ T ]] -
å®éã«è©ŠããŠã¿ã (1) (ã®å) ããã ãšããé¢ä¿ã åž°çŽçã«å°åºããäžã§ãæºããã¹ãæ¡ä»¶ãèããïŒ ã é¢ä¿ãæºããã¹ãæ¡ä»¶ ã â
: f ~ âšTâ©. T â T âš[[ T ]]â©. [[ T ]] â R [[ T ]] â â â â for all for all [[ T ]] (t, t ) â² ( â â (t), â â (t )) f ~ T f ~ Tâ² â² : â â (T, T ) â , â² R [[ T ]], [[ T ]] -
å®éã«è©ŠããŠã¿ã (2) ã®éšåéåãšããŠã颿°ã®æã¡äžã ã ä»»æã«ãšã£ãŠã¿ãïŒ (T, T ) â â²
R [[ g : T â T ]] â² â â â â for all for all [[ g ]] (t, t ) â² ( â â (t), â â (t )) f ~ T f ~ Tâ² â² : â â (T, T ) â , â² R [[ g ]], [[ g ]] -
å®éã«è©ŠããŠã¿ã (3) 颿°ã®æã¡äžã ã¯ã ãæºãã 2 Tuple ã®ã¿æã€ã®ã§ïŒ [[ g
]] (â, g(â)) â â â â for all for all [[ g ]] (t, â ) g(t) â tâ² ( â â (t), â ) f ~ T g( â â (t)) f ~ T â â â (t ) f ~ Tâ² â² : â â (T, T ) â , â² R [[ g ]], [[ g ]] -
å®éã«è©ŠããŠã¿ã (4) ãããŸã§ã®ç¶æ³ãæŽçãããšïŒ â â â tâ² â â (t
) f ~ Tâ² â² = = g(t) g( â â (t)) f ~ T -
å®éã«è©ŠããŠã¿ã (4) ãããŸã§ã®ç¶æ³ãæŽçãããšïŒ ä»£å ¥ããŠæŽçãããšã以äžã®çåŒãåŸãããïŒ â â â tâ² â â
(t ) f ~ Tâ² â² = = g(t) g( â â (t)) f ~ T â â (g(t)) = f ~ Tâ² g( â â (t)) f ~ T -
å®éã«è©ŠããŠã¿ã (4) ãããŸã§ã®ç¶æ³ãæŽçãããšïŒ ä»£å ¥ããŠæŽçãããšã以äžã®çåŒãåŸãããïŒ â ãã®çåŒã«ãã£ãŠã ã®å®è£ ãéå®ãããïŒ â â â
tâ² â â (t ) f ~ Tâ² â² = = g(t) g( â â (t)) f ~ T â â (g(t)) = f ~ Tâ² g( â â (t)) f ~ T â f ~ -
颿°é¢ä¿ïŒãµããã³ (1) 2 ã€ã®é¢ä¿ ãš ãçšããŠã 2 Tuple ã®åèŠçŽ ã颿°ãšãªããããªé¢ä¿ãå®çŸ©ã§ããïŒ [[
X ]] : (X, X ) â â² R [[ Y ]] : (Y, Y ) â â² R [[ X ]] â R [[ Y ]] : (X â Y, X â Y ) â â² â² R (f, f ) â â â â { â² for all (x, x ) â² (f(x), f (x )) â² â² â â [[ X ]], [[ Y ]] } -
颿°é¢ä¿ïŒãµããã³ (2) 2 ã€ã®é¢ä¿ ãš ãåãå·»ãç¶æ³ïŒ [[ X ]] :
(X, X ) â â² R [[ Y ]] : (Y, Y ) â â² R -
颿°é¢ä¿ïŒãµããã³ (3) ãã颿°ã®æã¡äžã ãã ãã颿°ã®æã¡äžã ãéžã¶ïŒ (X, X ) â
â² R [[ g ]] (Y, Y ) â â² R [[ h ]] -
颿°é¢ä¿ïŒãµããã³ (3) ãã颿°ã®æã¡äžã ãã ãã颿°ã®æã¡äžã ãéžã¶ïŒ â å®å šã«å¯æå³åŒïŒ (X, X
) â â² R [[ g ]] (Y, Y ) â â² R [[ h ]] -
ãŸãšã 颿°é¢ä¿ ã«ããã 坿å³åŒ ãåŸããã å šç§°é¢ä¿ ã«ããã èªç¶å€æ ãåŸããã ããããã
å€çžé¢æ°ã¯èªç¶å€æ ã§ããããšãããã ã åèæç® ã ãTheorems for free !ãby Philip Wadler ãåã·ã¹ãã å ¥é - ããã°ã©ãã³ã°èšèªãšåã®çè« -ãby ãªãŒã 瀟