ã自由モノイドのイテレーター(2) - エレファント・ビジュアライザー調査記録ãã§ç¡éé·ã®é ã®èªç±ã¢ãã¤ãã«ã¤ã㦠ChatGPT ã§èª¿ã¹ã¾ããããä»åã¯ãããæ¡å¼µãã¦ä»»æã®é åºæ°ã®é·ãã®é ãæã¤ãã®ã«ã¤ã㦠ChatGPT ã§èª¿ã¹ã¦ã¿ã¾ããããã®ä¸è¬çãªç¨èªã¯ãªããããªã®ã§ããã§ã¯ãè¶ éèªç±ã¢ãã¤ããã¨å¼ã¶ãã¨ã«ãã¾ãã
ãªã¹ãã¢ããã¯æéã®é ã®èªç±ã¢ãã¤ãã«å¯¾å¿ãããããªã®ã§ãããã®ç¡éã®å ´åã«ã¤ã㦠ChatGPT ã§èª¿ã¹ã¦ãã¾ããç¨èªããªãã¨ãªãã¨èª¬æããã®ã¯ãªããªãé£ããã§ãã
1 èªç±ã¢ãã¤ããæ¡å¼µãã¦ãä»»æã®é åºæ°ãé æ°ã¨ãªãããã«å®ç¾©ãã¦ãã ãã
以ä¸ã®çµæãè¿ããã¾ããã
èªç±ã¢ãã¤ããä»»æã®é åºæ°ãé æ°ã¨ãªãããã«æ¡å¼µããã«ã¯ãããã¤ãã®ã¹ããããè¸ãå¿ è¦ãããã¾ãã以ä¸ã¯ãã®å®ç¾©ã®æ¦è¦ã§ãã
1. èªç±ã¢ãã¤ãã®å®ç¾©ï¼æéã®å ´åï¼
èªç±ã¢ãã¤ãã¯ãããéå
ï¼ã¢ã«ãã¡ãããï¼ã«åºã¥ãã¦æ§ç¯ããããã¹ã¦ã®æéåã®éå
ã¨ãã¦å®ç¾©ããã¾ããããã§ã
ã¯
ä¸ã®æéåï¼ããªãã¡æéé·ã®æååï¼ã®éåã§ãã
- çµåæ¼ç®ã¯åã®é£çµ
ã§ãã
- åä½å ã¯ç©ºå
ã§ãã
2. ç¡éåã®å°å ¥
ãããä»»æã®é åºæ°ï¼ç¹ã«ç¡éé·ã®åï¼ã«æ¡å¼µããã«ã¯ãåã®é·ããé åºæ°ã«æ¡å¤§ãã¾ããããã§éè¦ãªã®ã¯ãé åºæ°ã«ããåãæ§æããéã«ã次ã®ãããªå½¢å¼ãèãããã¨ã§ãï¼
- åã®é·ãã
ã¨ããã
ã¯ä»»æã®é åºæ°ã¨ããã
ç¡éåã®å½¢å¼çãªè¨è¿°
ç¡éå
ã¯ãåã¤ã³ããã¯ã¹
ã«å¯¾ãã¦
ãæºããåã§ãã
3. æ¡å¼µèªç±ã¢ãã¤ãã®å®ç¾©
æ¡å¼µãããèªç±ã¢ãã¤ã
ã¯ä»¥ä¸ã®ããã«å®ç¾©ããã¾ãï¼
ã¯ä»»æã®åºæ°ï¼ã¾ãã¯é åºæ°ï¼ã
ã¯
ä¸ã®é·ããé åºæ°
ã§ãããã¹ã¦ã®åã®éåã§ãã
ããã§ãé åºæ°
ã®å ´åã
- å
ã¯å½¢å¼çã«
ã®å½¢ãæã¤ã
éå
ã®æ¼ç®
1. é£çµ: 2ã¤ã®å
ã¨
ãé£çµããã¨ãé åºæ°
ã®å
ãå¾ãããã®ã¨ãã
2. åä½å : é·ã 0 ã®åã¯å ¨ã¦ã®é£çµã®åä½å ã¨ãªãã
éå æ§
ãã®æ¼ç®ã¯ãåã®é·ããä¿ã¡ãªãããã¹ã¦ã®å
ã«å¯¾ãã¦å®ç¾©ãããã
4. é åºæ°å ¨ä½ã§ã®æ¡å¼µ
ããã«ããã¹ã¦ã®é åºæ°ã«å¯¾ãã¦æ¡å¼µãããèªç±ã¢ãã¤ããå®ç¾©ããå ´åãæ¬¡ã®ããã«èãã¾ãï¼
ããã§ã¯é åºæ°å ¨ä½ã®ã¯ã©ã¹ã§ãã
5. 注æç¹
- ç¡éé·ã®åãæ±ãéã«ã¯ãæ§æããå ã®åã«é¢ããå¶ç´ï¼ä¾ãã°é£ç¶æ§ã䏿æ§ï¼ãèæ ®ããå¿ è¦ãããã¾ãã
- åºæ°ãé åºæ°ã®åºå¥ãæç¢ºã«ããåã®é·ããã©ã®ããã«æ¡å¼µãããããæ éã«å®ç¾©ããå¿ è¦ãããã¾ãã
ãã®æ§é ã¯ãç¡éåãé åºæ°è«ãç¨ããåéã§æç¨ã§ãï¼ä¾ãã°å½¢å¼è¨èªãã¢ãã¤ãã®åè«çç ç©¶ï¼ã
2 ãã®ããã«æ¡å¼µãããèªç±ã¢ãã¤ãã¯ä¸è¬çã«ã¯ä½ã¨å¼ã°ãã¦ãã¾ãã
以ä¸ã®çµæãè¿ããã¾ããã
ã質åã«ããããã«ãä»»æã®é åºæ°ãé æ°ã¨ãã¦è¨±å®¹ããå½¢ã§æ¡å¼µãããèªç±ã¢ãã¤ãã¯ãä¸è¬çã«ã¯ç¹å®ã®æ¨æºçãªåç§°ã¯æããªããã¨ãå¤ãã§ãããã ããããã¤ãã®é¢é£ããæ¦å¿µãå¼ç§°ãããã¾ãã
1. é¢é£ããæ¦å¿µ
転éã¢ãã¤ãï¼Transfinite Monoidï¼
é åºæ°ãç¡éåã«åºã¥ãã¢ãã¤ãã®ä¸è¬çãªæ¡å¼µãæãå ´åã転éï¼transfiniteï¼ ã¨ããç¨èªã使ããããã¨ãããã¾ãããã¨ãã°ãç¡éã®æ¬¡å ãç¡éé·åãæ±ãã¢ãã¤ãæ§é ãã転éã¢ãã¤ããã¨å¼ã°ãããã¨ãããã¾ãã
転éåï¼Transfinite Sequenceï¼
é åºæ°ã«åºã¥ãåå ¨è¬ãã転éåãã¨å¼ã¶ãããããã«å¯¾å¿ããèªç±ã¢ãã¤ãããã®æèã§ã転éèªç±ã¢ãã¤ãï¼Transfinite Free Monoidï¼ãã¨å¼ã¶ãã¨ãå¯è½ã§ãã
ç¡éåã¢ãã¤ãï¼Monoid of Infinite Sequencesï¼
ç¡éåãæ±ãå ´åããç¡éåã¢ãã¤ããã¨ããè¨è¿°ã使ããããã¨ãããã¾ããããã®å ´åãç¡éåã®é·ããæ§é ã«é¢ãã追å ã®æ¡ä»¶ãæé»çã«å«ã¾ããå ´åãããã¾ãã
2. ã¢ãã¤ãã®æ®éçæ§æã¨ãã¦ã®è¦æ¹
èªç±ã¢ãã¤ãã¯æ®éæ§ã«ãã£ã¦å®ç¾©ãããããããã®æ¡å¼µãããã¢ãã¤ãã ã転éèªç±ã¢ãã¤ãã ã ãé åºæ°åã¢ãã¤ãã ã¨å¼ã¶ãã¨ãèªç¶ã§ããããã¯ããä¸ããããåºæ°ï¼ã¾ãã¯é åºæ°ï¼ã®åããçæãããã¢ãã¤ããã¨ãããã¥ã¢ã³ã¹ãæç¢ºã«ããå¼ã³æ¹ã§ãã
3. ä»ã®ç ç©¶åéã§ã®å¼ç§°
ãã®æ§é ãå ·ä½çã«è°è«ããããã¨ãããåéã«ã¯æ¬¡ã®ãããªãã®ãããã¾ãï¼
- åè«ã§ã¯ãèªç±ãªã³ã³ã³ããªã¼ãã¢ãã¤ãããã転éèªç±å¯¾è±¡ãã¨ãã¦è°è«ããããã¨ãããã¾ãã
- ã¢ãã«çè«ãå½¢å¼è¨èªçè«ã§ã¯ãç¹å®ã®ãæ¡å¼µå¯è½ãªèªã®éåããè°è«ããéã«é¡ä¼¼ã®æ¦å¿µãç»å ´ãã¾ãããçµ±ä¸ãããååã¯ãªããã¨ãå¤ãã§ãã
4. çµè«
æ¡å¼µãããèªç±ã¢ãã¤ãã«ã¯ã転éèªç±ã¢ãã¤ãï¼Transfinite Free Monoidï¼ãã¨ããåç§°ãé©ãã¦ãã¾ãããã ãããã®æ§é ã«ç¹åããçµ±ä¸çãªåç§°ã¯å¦è¡çã«ã¯åºãèªç¥ããã¦ããããæèã«å¿ãã説æãå¿ è¦ãªå ´åãããã¾ãã
3 ãã®ããã«æ¡å¼µãããèªç±ã¢ãã¤ããããã§ã¯ãè¶ éèªç±ã¢ãã¤ããã¨å¼ã¶ãã¨ã«ãã¾ãããªã¹ãã¢ããããè¶ éèªç±ã¢ãã¤ããã使ã£ã¦èª¬æãã¦ãã ãã
以ä¸ã®çµæãè¿ããã¾ããã
ãªã¹ãã¢ããããè¶ éèªç±ã¢ãã¤ããã使ã£ã¦èª¬æããã«ã¯ã以ä¸ã®ããã«é²ãããã¨ãã§ãã¾ããããã§ã¯ããè¶ éèªç±ã¢ãã¤ãããç¨ãã¦ãªã¹ãã¢ããã®ä¸è¬åãèãããã®ä¸ã§ã®å½¹å²ã説æãã¾ãã
1. ãªã¹ãã¢ããã®åºæ¬æ§é
é常ã®ãªã¹ãã¢ããã¯ã以ä¸ã®ããã«æ§æããã¾ãï¼
- åã³ã³ã¹ãã©ã¯ã¿
: ããéå
ã«å¯¾ãã¦ã
ã¯
ã®ãã¹ã¦ã®æéåã®éåã
- åä½ (Unit)
: å
ãé·ã 1 ã®ãªã¹ã
] ã«åãã
- çµå (Join)
: ãªã¹ãã®ãªã¹ã
ãå¹³å¦åãã¦
ã«å¤æããã
ããããæºãã
ã¯ã¢ããã«ãªãã¾ãã
2. è¶ éèªç±ã¢ãã¤ãã«åºã¥ããªã¹ãã¢ãã
ãè¶ éèªç±ã¢ãã¤ãããç¨ããã¨ããªã¹ãã¢ããã®å¯¾è±¡ãæéåãããä»»æã®é åºæ°é·ã®åãã«æ¡å¼µã§ãã¾ãã以ä¸ã«ãã®æ§é ã説æãã¾ãã
åã³ã³ã¹ãã©ã¯ã¿
éå
ã«å¯¾ãã¦ãè¶ éèªç±ã¢ãã¤ãã«åºã¥ãåã³ã³ã¹ãã©ã¯ã¿
ãæ¬¡ã®ããã«å®ç¾©ãã¾ãï¼
ããã§ã¯é·ããé åºæ°
ã§ãã
ä¸ã®åã®éåã§ãã
åä½ (Unit)
é常ã®ãªã¹ãã¢ããã®åä½ã¨åæ§ã
ã¯å
ãé·ã 1 ã®å
ã«åãã¾ãã
çµå (Join)
è¶ éèªç±ã¢ãã¤ãã§ã¯ãçµå
ãæ¬¡ã®ããã«å®ç¾©ãã¾ãï¼
- ä»»æã®
-é·å
ã¯ãå
ã
ã®å ï¼ã¤ã¾ãé åºæ°é·ã®åï¼ã§æ§æããã¦ãã¾ãã
ã¯ãããå¹³å¦åãããã¹ã¦ã®è¦ç´ ãä¸ã¤ã®åã«çµ±åãã¾ãï¼
ããã§ãå¹³å¦åã¯å ã®é åºãä¿ã¡ã¤ã¤åãé£çµãã¾ãã3. ã¢ããåã®ç¢ºèª
1. åä½å ã®å·¦å使§ã»å³å使§:
ä»»æã®ã«å¯¾ãã¦ã
,
ã
ãã®æ§è³ªã¯æéé·ã®ãªã¹ãã¢ããã¨åæ§ã«ä¿ããã¾ãã
2. çµåã®çµåæ§:
ãã
ã¸ã®çµå
ã¯é åºæ°ã®ç´¯ç©ã«åºã¥ãã¦å®ç¾©ããããããçµåæ§ãæç«ãã¾ãã
4. ãªã¹ãã¢ããã®è¶ éçæ¡å¼µã¨ãã¦ã®è§£é
è¶ éèªç±ã¢ãã¤ãã使ããã¨ã§ããªã¹ãã¢ãããæ¬¡ã®ããã«æ¡å¼µã§ãã¾ãï¼
- é常ã®ãªã¹ãã¢ããã¯æéåããæ±ãã¾ããããè¶ éèªç±ã¢ãã¤ããç¨ããã¨ç¡éåï¼è»¢éåï¼ãä»»æã®é åºæ°é·ã®åãæ±ããã¨ãã§ãã¾ãã
- çµåãåä½ã®æä½ãè¶ éåã®é·ããæ±ãããã«èªç¶ã«æ¡å¼µãããã¢ããåãæºããã¾ãã
5. å¿ç¨
ãã®ãããªè¶ éçãªãªã¹ãã¢ããã®æ§é ã¯ã以ä¸ã®ãããªå ´é¢ã§å½¹ç«ã¡ã¾ãï¼
- ç¡éåãã¼ã¿ã®ã¢ããªã³ã°: ä»»æã®é åºæ°é·ã®åãæ±ãããããç¡éãã¼ã¿åãé åºæ°ã«é¢é£ããã¢ã«ã´ãªãºã ã«é©ç¨ã§ãã¾ãã
- å½¢å¼è«çã»ã¢ãã«çè«: é åºæ°ã«åºã¥ããæ§é ãåãèããå ´åãè¶ éèªç±ã¢ãã¤ããåºç¤ã¨ãããªã¹ãã¢ãããæç¨ã§ãã
çµè«
è¶ éèªç±ã¢ãã¤ãã¯ãªã¹ãã¢ãããä»»æã®é åºæ°é·ã®åã«æ¡å¼µããèªç¶ãªæ çµã¿ãæä¾ãã¾ãããã®æ¡å¼µã«ãããæéåã ãã§ãªãç¡éåãä»»æã®é åºæ°é·ã®åãæ±ããããã«ãªãã¾ãã
4 ç¡éé·ã®ãªã¹ããæ±ããã¨ãã§ããããã°ã©ãã³ã°è¨èªã®ãªã¹ãããè¶ éèªç±ã¢ãã¤ããã使ã£ã¦èª¬æãã¦ãã ãã
以ä¸ã®çµæãè¿ããã¾ããã
ç¡éé·ã®ãªã¹ããæ±ããã¨ãã§ããããã°ã©ãã³ã°è¨èªããè¶ éèªç±ã¢ãã¤ããã使ã£ã¦èª¬æããã«ã¯ãè¨èªã®ãã¼ã¿æ§é ãæä½ããè¶ éèªç±ã¢ãã¤ãã®æ§é ãã©ã®ããã«è¡¨ç¾ããããèãã¾ãã以ä¸ã«ããã®èãæ¹ã¨å ·ä½ä¾ã示ãã¾ãã
1. ç¡éé·ãªã¹ãã¨è¶ éèªç±ã¢ãã¤ãã®å¯¾å¿
ãè¶ éèªç±ã¢ãã¤ããã®æ§é ã§ã¯ããªã¹ãã®é·ããä»»æã®é åºæ°ï¼æéã¾ãã¯ç¡éï¼ã«æ¡å¼µããã¦ãã¾ãããã®ç¹æ§ã«åºã¥ãã¦ãããã°ã©ãã³ã°è¨èªã以ä¸ã®ç¹å¾´ãæã¤ã¨ããããã¯è¶ éèªç±ã¢ãã¤ãã®æ§é ã表ç¾ã§ããã¨è¨ãã¾ãï¼
- ç¡éé·ã®ãªã¹ããå®ç¾©å¯è½: ããã°ã©ã å ã§ç¡éé·ã®ãªã¹ããè¨è¿°ã§ããã
- é å»¶è©ä¾¡: ãªã¹ããå®å ¨ã«å±éãããå¿ è¦ãªé¨åã ããè©ä¾¡ããä»çµã¿ã
- ãªã¹ãã®çµåæä½: ãªã¹ããé£çµããæä½ãã¢ãã¤ãã®çµåå¾ãæºããã
2. 代表çãªããã°ã©ãã³ã°è¨èª
以ä¸ã¯ç¡éé·ã®ãªã¹ããæ±ããããã°ã©ãã³ã°è¨èªã®ä¾ã§ãã
1. Haskell
- Haskellã¯é å»¶è©ä¾¡ï¼lazy evaluationï¼ãæã¤ç´ç²é¢æ°åè¨èªã§ãã
- ç¡éé·ãªã¹ãã¯ãè¶ éèªç±ã¢ãã¤ããã®å ã¨ãã¦ç´æ¥æ±ãã¾ãããã¨ãã°ã以ä¸ã®ããã«ç¡éãªã¹ããå®ç¾©ã§ãã¾ãï¼
naturals = [0..] -- èªç¶æ°ã®ç¡éãªã¹ã
- è¶ éèªç±ã¢ãã¤ãã®æ¼ç®:
- ãªã¹ãã®çµå㯠`++` æ¼ç®åãç¨ãã¦è¡ãã¾ãï¼
combined = [1, 2] ++ naturals -- [1, 2, 0, 1, 2, ...]
- ç¡éåã®åè¦ç´ ã¯å¿ è¦ã«å¿ãã¦çæããã¾ãã
2. Pythonï¼é å»¶è©ä¾¡ãå©ç¨ï¼
- Pythonèªä½ã¯ç¡éãªã¹ãããã¤ãã£ãã«æ±ãã¾ããããã¸ã§ãã¬ã¼ã¿ï¼generatorï¼ãç¨ãããã¨ã§åçã®æ§é ãå®ç¾ã§ãã¾ãã
- ä¾ï¼
def naturals(): n = 0 while True: yield n n += 1
- è¶ éèªç±ã¢ãã¤ãã®æ¼ç®:
- ã¸ã§ãã¬ã¼ã¿ã®çµå㯠itertools ãç¨ãã¦è¡ãã¾ãï¼
from itertools import chain gen1 = (x for x in [1, 2]) combined = chain(gen1, naturals())3. Scala
- Scalaã¯ç¡éé·ãªã¹ãã `Stream`ï¼ç¾å¨ã®ãã¼ã¸ã§ã³ã§ã¯ `LazyList`ï¼ã¨ãã¦æ±ãã¾ãã
- ä¾ï¼
val naturals: LazyList[Int] = LazyList.from(0)
- è¶ éèªç±ã¢ãã¤ãã®æ¼ç®:
- ãªã¹ãã®çµåï¼
val combined = List(1, 2) ++ naturals4. OCaml
- OCamlã§ã¯é å»¶è©ä¾¡ã使ç¨ãã¦ç¡éãªã¹ããæ±ãã¾ãã
- ä¾ï¼
let rec naturals n = Seq.Cons (n, fun () -> naturals (n + 1))5. ãã®ä»ã®è¨èª
- F#: `Seq` ã¢ã¸ã¥ã¼ã«ã使ã£ã¦ç¡éåãæ±ãã¾ãã
- Clojure: é å»¶åã `lazy-seq` ã§å®ç¾©å¯è½ã
- JavaScript: ã¸ã§ãã¬ã¼ã¿ã¨ `async` ã¸ã§ãã¬ã¼ã¿ã使ç¨ãã¦ç¡éåã表ç¾ã§ãã¾ãã
3. è¶ éèªç±ã¢ãã¤ãã¨ãã¦ã®è§£é
ãããã®è¨èªã§ã¯ãç¡éé·ã®ãªã¹ããæ¬¡ã®ããã«ãè¶ éèªç±ã¢ãã¤ããã¨ãã¦æ±ãã¾ãï¼
1. å ã®å®ç¾©: åè¨èªã®ç¡éãªã¹ãï¼ã¾ãã¯é å»¶åï¼ãè¶ éèªç±ã¢ãã¤ãã®å ã«å¯¾å¿ãã¾ãã
2. åä½å : 空ãªã¹ãã空ã®ã¸ã§ãã¬ã¼ã¿ãåä½å ã«å¯¾å¿ãã¾ãã
3. çµåæä½: ãªã¹ããã¸ã§ãã¬ã¼ã¿ã®é£çµæä½ãã¢ãã¤ãã®çµåå¾ãæºããã¾ãã
4. ç¡éé·åã®æ§ç¯: é å»¶è©ä¾¡ãéãã¦é åºæ°çé·ãã®åãå®ç¾å¯è½ã4. å¿ç¨ã¨å©ç¹
è¶ éèªç±ã¢ãã¤ãã®è¦ç¹ãéãã¦ããããã®è¨èªãç¡éåã®æä½ã«ããã¦æ¬¡ã®å©ç¹ãæä¾ãã¾ãï¼
- ç¡éãã¼ã¿ã®å¹ççãªå¦çã
- çµåãå帰çæä½ã®æ½è±¡åã
- ãã¼ã¿ã¹ããªã¼ã ãéåæå¦çã®èªç¶ãªè¡¨ç¾ã
çµè«
ç¡éé·ãªã¹ããæ±ããããã°ã©ãã³ã°è¨èªã¯ããè¶ éèªç±ã¢ãã¤ããã®æ§é ãç¨ãã¦ç¡éåãå¹ççã«ã¢ãã«åãæä½ããè½åãæã£ã¦ãã¾ããHaskellãScalaã®ãããªé¢æ°åè¨èªã¯ãè¶ éèªç±ã¢ãã¤ãã®çè«çæ§è³ªã«æãèªç¶ã«é©åãã¾ãããPythonãJavaScriptã®ãããªè¨èªãã¸ã§ãã¬ã¼ã¿ãç¨ãããã¨ã§åæ§ã®è½åãæä¾ã§ãã¾ãã