@k2works/claude-code-booster 6.1.0 → 6.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (622) hide show
  1. package/lib/assets/.claude/skills/practicing-getting-start-tdd/SKILL.md +3 -7
  2. package/lib/assets/docs/article/index.md +16 -41
  3. package/lib/assets/docs/assets/js/extra.js +5 -1
  4. package/lib/assets/docs/assets/js/mathjax.js +27 -0
  5. package/lib/assets/docs/index.md +1 -1
  6. package/lib/assets/mkdocs.yml +6 -7
  7. package/lib/assets/ops/docker/mkdoc/Dockerfile +19 -19
  8. package/lib/assets/package.json +1 -1
  9. package/package.json +1 -1
  10. package/lib/assets/docs/article/functional-desgin-ppp/all/01-immutability-and-data-transformation.md +0 -484
  11. package/lib/assets/docs/article/functional-desgin-ppp/all/02-function-composition.md +0 -528
  12. package/lib/assets/docs/article/functional-desgin-ppp/all/03-polymorphism.md +0 -546
  13. package/lib/assets/docs/article/functional-desgin-ppp/all/04-data-validation.md +0 -309
  14. package/lib/assets/docs/article/functional-desgin-ppp/all/05-property-based-testing.md +0 -329
  15. package/lib/assets/docs/article/functional-desgin-ppp/all/06-tdd-and-functional.md +0 -507
  16. package/lib/assets/docs/article/functional-desgin-ppp/all/07-composite-pattern.md +0 -307
  17. package/lib/assets/docs/article/functional-desgin-ppp/all/08-decorator-pattern.md +0 -300
  18. package/lib/assets/docs/article/functional-desgin-ppp/all/09-adapter-pattern.md +0 -345
  19. package/lib/assets/docs/article/functional-desgin-ppp/all/10-strategy-pattern.md +0 -312
  20. package/lib/assets/docs/article/functional-desgin-ppp/all/11-command-pattern.md +0 -295
  21. package/lib/assets/docs/article/functional-desgin-ppp/all/12-visitor-pattern.md +0 -331
  22. package/lib/assets/docs/article/functional-desgin-ppp/all/13-abstract-factory-pattern.md +0 -328
  23. package/lib/assets/docs/article/functional-desgin-ppp/all/14-abstract-server-pattern.md +0 -374
  24. package/lib/assets/docs/article/functional-desgin-ppp/all/15-gossiping-bus-drivers.md +0 -165
  25. package/lib/assets/docs/article/functional-desgin-ppp/all/16-payroll-system.md +0 -187
  26. package/lib/assets/docs/article/functional-desgin-ppp/all/17-video-rental-system.md +0 -321
  27. package/lib/assets/docs/article/functional-desgin-ppp/all/18-concurrency-system.md +0 -296
  28. package/lib/assets/docs/article/functional-desgin-ppp/all/19-wa-tor-simulation.md +0 -295
  29. package/lib/assets/docs/article/functional-desgin-ppp/all/20-pattern-interactions.md +0 -283
  30. package/lib/assets/docs/article/functional-desgin-ppp/all/21-best-practices.md +0 -303
  31. package/lib/assets/docs/article/functional-desgin-ppp/all/22-oo-to-fp-migration.md +0 -346
  32. package/lib/assets/docs/article/functional-desgin-ppp/all/index.md +0 -388
  33. package/lib/assets/docs/article/functional-desgin-ppp/clojure/01-immutability-and-data-transformation.md +0 -282
  34. package/lib/assets/docs/article/functional-desgin-ppp/clojure/02-function-composition.md +0 -389
  35. package/lib/assets/docs/article/functional-desgin-ppp/clojure/03-polymorphism.md +0 -393
  36. package/lib/assets/docs/article/functional-desgin-ppp/clojure/04-clojure-spec.md +0 -359
  37. package/lib/assets/docs/article/functional-desgin-ppp/clojure/05-property-based-testing.md +0 -361
  38. package/lib/assets/docs/article/functional-desgin-ppp/clojure/06-tdd-in-functional.md +0 -392
  39. package/lib/assets/docs/article/functional-desgin-ppp/clojure/07-composite-pattern.md +0 -538
  40. package/lib/assets/docs/article/functional-desgin-ppp/clojure/08-decorator-pattern.md +0 -404
  41. package/lib/assets/docs/article/functional-desgin-ppp/clojure/09-adapter-pattern.md +0 -408
  42. package/lib/assets/docs/article/functional-desgin-ppp/clojure/10-strategy-pattern.md +0 -494
  43. package/lib/assets/docs/article/functional-desgin-ppp/clojure/11-command-pattern.md +0 -575
  44. package/lib/assets/docs/article/functional-desgin-ppp/clojure/12-visitor-pattern.md +0 -576
  45. package/lib/assets/docs/article/functional-desgin-ppp/clojure/13-abstract-factory-pattern.md +0 -484
  46. package/lib/assets/docs/article/functional-desgin-ppp/clojure/14-abstract-server-pattern.md +0 -471
  47. package/lib/assets/docs/article/functional-desgin-ppp/clojure/15-gossiping-bus-drivers.md +0 -334
  48. package/lib/assets/docs/article/functional-desgin-ppp/clojure/16-payroll-system.md +0 -410
  49. package/lib/assets/docs/article/functional-desgin-ppp/clojure/17-video-rental-system.md +0 -459
  50. package/lib/assets/docs/article/functional-desgin-ppp/clojure/18-concurrency-system.md +0 -484
  51. package/lib/assets/docs/article/functional-desgin-ppp/clojure/19-wator-simulation.md +0 -748
  52. package/lib/assets/docs/article/functional-desgin-ppp/clojure/20-pattern-interactions.md +0 -576
  53. package/lib/assets/docs/article/functional-desgin-ppp/clojure/21-best-practices.md +0 -527
  54. package/lib/assets/docs/article/functional-desgin-ppp/clojure/22-oo-to-fp-migration.md +0 -541
  55. package/lib/assets/docs/article/functional-desgin-ppp/clojure/index.md +0 -241
  56. package/lib/assets/docs/article/functional-desgin-ppp/elixir/01-immutability-and-data-transformation.md +0 -392
  57. package/lib/assets/docs/article/functional-desgin-ppp/elixir/02-function-composition.md +0 -383
  58. package/lib/assets/docs/article/functional-desgin-ppp/elixir/03-polymorphism.md +0 -384
  59. package/lib/assets/docs/article/functional-desgin-ppp/elixir/04-data-validation.md +0 -204
  60. package/lib/assets/docs/article/functional-desgin-ppp/elixir/05-property-based-testing.md +0 -277
  61. package/lib/assets/docs/article/functional-desgin-ppp/elixir/06-tdd-and-fp.md +0 -303
  62. package/lib/assets/docs/article/functional-desgin-ppp/elixir/07-effects-and-pure-functions.md +0 -173
  63. package/lib/assets/docs/article/functional-desgin-ppp/elixir/08-error-handling-strategies.md +0 -177
  64. package/lib/assets/docs/article/functional-desgin-ppp/elixir/09-io-and-external-systems.md +0 -263
  65. package/lib/assets/docs/article/functional-desgin-ppp/elixir/10-concurrency-patterns.md +0 -278
  66. package/lib/assets/docs/article/functional-desgin-ppp/elixir/11-command-pattern.md +0 -157
  67. package/lib/assets/docs/article/functional-desgin-ppp/elixir/12-visitor-pattern.md +0 -185
  68. package/lib/assets/docs/article/functional-desgin-ppp/elixir/13-abstract-factory-pattern.md +0 -613
  69. package/lib/assets/docs/article/functional-desgin-ppp/elixir/14-abstract-server-pattern.md +0 -738
  70. package/lib/assets/docs/article/functional-desgin-ppp/elixir/15-gossiping-bus-drivers.md +0 -300
  71. package/lib/assets/docs/article/functional-desgin-ppp/elixir/16-payroll-system.md +0 -429
  72. package/lib/assets/docs/article/functional-desgin-ppp/elixir/17-video-rental-system.md +0 -328
  73. package/lib/assets/docs/article/functional-desgin-ppp/elixir/18-concurrency-system.md +0 -475
  74. package/lib/assets/docs/article/functional-desgin-ppp/elixir/19-wator-simulation.md +0 -532
  75. package/lib/assets/docs/article/functional-desgin-ppp/elixir/20-pattern-interactions.md +0 -296
  76. package/lib/assets/docs/article/functional-desgin-ppp/elixir/21-best-practices.md +0 -349
  77. package/lib/assets/docs/article/functional-desgin-ppp/elixir/22-oo-to-fp-migration.md +0 -404
  78. package/lib/assets/docs/article/functional-desgin-ppp/elixir/index.md +0 -248
  79. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/01-immutability-and-data-transformation.md +0 -393
  80. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/02-function-composition.md +0 -461
  81. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/03-polymorphism.md +0 -504
  82. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/04-data-validation.md +0 -425
  83. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/05-property-based-testing.md +0 -391
  84. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/06-tdd-functional.md +0 -696
  85. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/07-composite-pattern.md +0 -451
  86. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/08-decorator-pattern.md +0 -488
  87. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/09-adapter-pattern.md +0 -488
  88. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/10-strategy-pattern.md +0 -436
  89. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/11-command-pattern.md +0 -437
  90. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/12-visitor-pattern.md +0 -348
  91. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/13-abstract-factory-pattern.md +0 -318
  92. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/14-abstract-server-pattern.md +0 -605
  93. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/15-gossiping-bus-drivers.md +0 -364
  94. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/16-payroll-system.md +0 -359
  95. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/17-video-rental-system.md +0 -423
  96. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/18-concurrency-system.md +0 -376
  97. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/19-wator-simulation.md +0 -412
  98. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/20-pattern-interactions.md +0 -300
  99. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/21-best-practices.md +0 -333
  100. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/22-oo-to-fp-migration.md +0 -341
  101. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/index.md +0 -274
  102. package/lib/assets/docs/article/functional-desgin-ppp/haskell/01-immutability-and-data-transformation.md +0 -307
  103. package/lib/assets/docs/article/functional-desgin-ppp/haskell/02-function-composition.md +0 -313
  104. package/lib/assets/docs/article/functional-desgin-ppp/haskell/03-polymorphism.md +0 -371
  105. package/lib/assets/docs/article/functional-desgin-ppp/haskell/04-data-validation.md +0 -266
  106. package/lib/assets/docs/article/functional-desgin-ppp/haskell/05-property-based-testing.md +0 -263
  107. package/lib/assets/docs/article/functional-desgin-ppp/haskell/06-tdd-functional.md +0 -292
  108. package/lib/assets/docs/article/functional-desgin-ppp/haskell/07-composite-pattern.md +0 -404
  109. package/lib/assets/docs/article/functional-desgin-ppp/haskell/08-decorator-pattern.md +0 -328
  110. package/lib/assets/docs/article/functional-desgin-ppp/haskell/09-adapter-pattern.md +0 -391
  111. package/lib/assets/docs/article/functional-desgin-ppp/haskell/10-strategy-pattern.md +0 -296
  112. package/lib/assets/docs/article/functional-desgin-ppp/haskell/11-command-pattern.md +0 -312
  113. package/lib/assets/docs/article/functional-desgin-ppp/haskell/12-visitor-pattern.md +0 -335
  114. package/lib/assets/docs/article/functional-desgin-ppp/haskell/13-abstract-factory-pattern.md +0 -341
  115. package/lib/assets/docs/article/functional-desgin-ppp/haskell/14-abstract-server-pattern.md +0 -388
  116. package/lib/assets/docs/article/functional-desgin-ppp/haskell/15-gossiping-bus-drivers.md +0 -186
  117. package/lib/assets/docs/article/functional-desgin-ppp/haskell/16-payroll-system.md +0 -228
  118. package/lib/assets/docs/article/functional-desgin-ppp/haskell/17-video-rental-system.md +0 -253
  119. package/lib/assets/docs/article/functional-desgin-ppp/haskell/18-concurrency-system.md +0 -372
  120. package/lib/assets/docs/article/functional-desgin-ppp/haskell/19-wator-simulation.md +0 -447
  121. package/lib/assets/docs/article/functional-desgin-ppp/haskell/20-pattern-interactions.md +0 -334
  122. package/lib/assets/docs/article/functional-desgin-ppp/haskell/21-best-practices.md +0 -412
  123. package/lib/assets/docs/article/functional-desgin-ppp/haskell/22-oo-to-fp-migration.md +0 -478
  124. package/lib/assets/docs/article/functional-desgin-ppp/haskell/index.md +0 -174
  125. package/lib/assets/docs/article/functional-desgin-ppp/index.md +0 -90
  126. package/lib/assets/docs/article/functional-desgin-ppp/rust/01-immutability-and-data-transformation.md +0 -459
  127. package/lib/assets/docs/article/functional-desgin-ppp/rust/02-function-composition.md +0 -472
  128. package/lib/assets/docs/article/functional-desgin-ppp/rust/03-polymorphism.md +0 -434
  129. package/lib/assets/docs/article/functional-desgin-ppp/rust/04-data-validation.md +0 -282
  130. package/lib/assets/docs/article/functional-desgin-ppp/rust/05-property-based-testing.md +0 -256
  131. package/lib/assets/docs/article/functional-desgin-ppp/rust/06-tdd-and-functional.md +0 -850
  132. package/lib/assets/docs/article/functional-desgin-ppp/rust/07-composite-pattern.md +0 -393
  133. package/lib/assets/docs/article/functional-desgin-ppp/rust/08-decorator-pattern.md +0 -392
  134. package/lib/assets/docs/article/functional-desgin-ppp/rust/09-adapter-pattern.md +0 -348
  135. package/lib/assets/docs/article/functional-desgin-ppp/rust/10-strategy-pattern.md +0 -340
  136. package/lib/assets/docs/article/functional-desgin-ppp/rust/11-command-pattern.md +0 -365
  137. package/lib/assets/docs/article/functional-desgin-ppp/rust/12-visitor-pattern.md +0 -388
  138. package/lib/assets/docs/article/functional-desgin-ppp/rust/13-abstract-factory-pattern.md +0 -370
  139. package/lib/assets/docs/article/functional-desgin-ppp/rust/14-abstract-server-pattern.md +0 -401
  140. package/lib/assets/docs/article/functional-desgin-ppp/rust/15-gossiping-bus-drivers.md +0 -309
  141. package/lib/assets/docs/article/functional-desgin-ppp/rust/16-payroll-system.md +0 -306
  142. package/lib/assets/docs/article/functional-desgin-ppp/rust/17-video-rental-system.md +0 -313
  143. package/lib/assets/docs/article/functional-desgin-ppp/rust/18-concurrency-system.md +0 -324
  144. package/lib/assets/docs/article/functional-desgin-ppp/rust/19-wator-simulation.md +0 -320
  145. package/lib/assets/docs/article/functional-desgin-ppp/rust/20-pattern-interactions.md +0 -313
  146. package/lib/assets/docs/article/functional-desgin-ppp/rust/21-best-practices.md +0 -345
  147. package/lib/assets/docs/article/functional-desgin-ppp/rust/22-oo-to-fp-migration.md +0 -358
  148. package/lib/assets/docs/article/functional-desgin-ppp/rust/index.md +0 -243
  149. package/lib/assets/docs/article/functional-desgin-ppp/scala/01-immutability-and-data-transformation.md +0 -337
  150. package/lib/assets/docs/article/functional-desgin-ppp/scala/02-function-composition.md +0 -357
  151. package/lib/assets/docs/article/functional-desgin-ppp/scala/03-polymorphism.md +0 -366
  152. package/lib/assets/docs/article/functional-desgin-ppp/scala/04-data-validation.md +0 -373
  153. package/lib/assets/docs/article/functional-desgin-ppp/scala/05-property-based-testing.md +0 -524
  154. package/lib/assets/docs/article/functional-desgin-ppp/scala/06-tdd-functional.md +0 -566
  155. package/lib/assets/docs/article/functional-desgin-ppp/scala/07-composite-pattern.md +0 -372
  156. package/lib/assets/docs/article/functional-desgin-ppp/scala/08-decorator-pattern.md +0 -336
  157. package/lib/assets/docs/article/functional-desgin-ppp/scala/09-adapter-pattern.md +0 -526
  158. package/lib/assets/docs/article/functional-desgin-ppp/scala/10-strategy-pattern.md +0 -450
  159. package/lib/assets/docs/article/functional-desgin-ppp/scala/11-command-pattern.md +0 -416
  160. package/lib/assets/docs/article/functional-desgin-ppp/scala/12-visitor-pattern.md +0 -388
  161. package/lib/assets/docs/article/functional-desgin-ppp/scala/13-abstract-factory-pattern.md +0 -407
  162. package/lib/assets/docs/article/functional-desgin-ppp/scala/14-abstract-server-pattern.md +0 -485
  163. package/lib/assets/docs/article/functional-desgin-ppp/scala/15-gossiping-bus-drivers.md +0 -400
  164. package/lib/assets/docs/article/functional-desgin-ppp/scala/16-payroll-system.md +0 -351
  165. package/lib/assets/docs/article/functional-desgin-ppp/scala/17-video-rental-system.md +0 -333
  166. package/lib/assets/docs/article/functional-desgin-ppp/scala/18-concurrency-system.md +0 -739
  167. package/lib/assets/docs/article/functional-desgin-ppp/scala/19-wator-simulation.md +0 -633
  168. package/lib/assets/docs/article/functional-desgin-ppp/scala/20-pattern-interactions.md +0 -521
  169. package/lib/assets/docs/article/functional-desgin-ppp/scala/21-best-practices.md +0 -442
  170. package/lib/assets/docs/article/functional-desgin-ppp/scala/22-oo-to-fp-migration.md +0 -697
  171. package/lib/assets/docs/article/functional-desgin-ppp/scala/index.md +0 -243
  172. package/lib/assets/docs/article/getting-start-docker-kubernetes/01-container-and-docker-basics.md +0 -341
  173. package/lib/assets/docs/article/getting-start-docker-kubernetes/02-container-deployment.md +0 -785
  174. package/lib/assets/docs/article/getting-start-docker-kubernetes/03-practical-container-build-deploy.md +0 -466
  175. package/lib/assets/docs/article/getting-start-docker-kubernetes/04-multi-container-application.md +0 -878
  176. package/lib/assets/docs/article/getting-start-docker-kubernetes/05-kubernetes-introduction.md +0 -585
  177. package/lib/assets/docs/article/getting-start-docker-kubernetes/06-kubernetes-deploy-cluster.md +0 -620
  178. package/lib/assets/docs/article/getting-start-docker-kubernetes/07-kubernetes-advanced.md +0 -621
  179. package/lib/assets/docs/article/getting-start-docker-kubernetes/08-kubernetes-packaging.md +0 -518
  180. package/lib/assets/docs/article/getting-start-docker-kubernetes/09-container-operations.md +0 -546
  181. package/lib/assets/docs/article/getting-start-docker-kubernetes/10-optimal-container-image.md +0 -640
  182. package/lib/assets/docs/article/getting-start-docker-kubernetes/11-continuous-delivery.md +0 -607
  183. package/lib/assets/docs/article/getting-start-docker-kubernetes/12-container-use-cases.md +0 -463
  184. package/lib/assets/docs/article/getting-start-docker-kubernetes/13-case-monolith-compose-vs-kustomize.md +0 -346
  185. package/lib/assets/docs/article/getting-start-docker-kubernetes/14-case-event-driven-kustomize-vs-helm.md +0 -324
  186. package/lib/assets/docs/article/getting-start-docker-kubernetes/15-case-escqrs-axon-kustomize-vs-helm.md +0 -297
  187. package/lib/assets/docs/article/getting-start-docker-kubernetes/16-case-escqrs-kafka-kustomize-vs-helm.md +0 -256
  188. package/lib/assets/docs/article/getting-start-docker-kubernetes/17-case-comparison-summary.md +0 -141
  189. package/lib/assets/docs/article/getting-start-docker-kubernetes/18-case-load-testing.md +0 -303
  190. package/lib/assets/docs/article/getting-start-docker-kubernetes/appendix-a-dev-tools-setup.md +0 -274
  191. package/lib/assets/docs/article/getting-start-docker-kubernetes/appendix-b-orchestration-environments.md +0 -530
  192. package/lib/assets/docs/article/getting-start-docker-kubernetes/appendix-c-tips.md +0 -519
  193. package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-01-comic.png +0 -0
  194. package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-02-comic.png +0 -0
  195. package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-03-comic.png +0 -0
  196. package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-04-comic.png +0 -0
  197. package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-05-comic.png +0 -0
  198. package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-06-comic.png +0 -0
  199. package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-07-comic.png +0 -0
  200. package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-08-comic.png +0 -0
  201. package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-09-comic.png +0 -0
  202. package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-10-comic.png +0 -0
  203. package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-11-comic.png +0 -0
  204. package/lib/assets/docs/article/getting-start-docker-kubernetes/images/chapter-12-comic.png +0 -0
  205. package/lib/assets/docs/article/getting-start-docker-kubernetes/images/overview-comic.png +0 -0
  206. package/lib/assets/docs/article/getting-start-docker-kubernetes/index.md +0 -82
  207. package/lib/assets/docs/article/getting-start-docker-kubernetes/outline.md +0 -220
  208. package/lib/assets/docs/article/getting-start-tdd/clojure/01-todo-list-and-first-test.md +0 -175
  209. package/lib/assets/docs/article/getting-start-tdd/clojure/02-fake-it-and-triangulation.md +0 -171
  210. package/lib/assets/docs/article/getting-start-tdd/clojure/03-obvious-implementation-and-refactoring.md +0 -144
  211. package/lib/assets/docs/article/getting-start-tdd/clojure/04-version-control-and-conventional-commits.md +0 -97
  212. package/lib/assets/docs/article/getting-start-tdd/clojure/05-package-management-and-static-analysis.md +0 -308
  213. package/lib/assets/docs/article/getting-start-tdd/clojure/06-task-runner-and-ci-cd.md +0 -250
  214. package/lib/assets/docs/article/getting-start-tdd/clojure/07-protocols-and-records.md +0 -140
  215. package/lib/assets/docs/article/getting-start-tdd/clojure/08-multimethods-and-design-patterns.md +0 -139
  216. package/lib/assets/docs/article/getting-start-tdd/clojure/09-namespaces-and-module-design.md +0 -136
  217. package/lib/assets/docs/article/getting-start-tdd/clojure/10-higher-order-functions-and-composition.md +0 -123
  218. package/lib/assets/docs/article/getting-start-tdd/clojure/11-persistent-data-and-pipeline.md +0 -147
  219. package/lib/assets/docs/article/getting-start-tdd/clojure/12-error-handling-and-spec.md +0 -170
  220. package/lib/assets/docs/article/getting-start-tdd/clojure/index.md +0 -65
  221. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter01.md +0 -241
  222. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter02.md +0 -253
  223. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter03.md +0 -211
  224. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter04.md +0 -101
  225. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter05.md +0 -265
  226. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter06.md +0 -204
  227. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter07.md +0 -223
  228. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter08.md +0 -258
  229. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter09.md +0 -183
  230. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter10.md +0 -175
  231. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter11.md +0 -201
  232. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter12.md +0 -220
  233. package/lib/assets/docs/article/getting-start-tdd/csharp/index.md +0 -83
  234. package/lib/assets/docs/article/getting-start-tdd/elixir/01-todo-list-and-first-test.md +0 -96
  235. package/lib/assets/docs/article/getting-start-tdd/elixir/02-fake-it-and-triangulation.md +0 -104
  236. package/lib/assets/docs/article/getting-start-tdd/elixir/03-obvious-implementation-and-refactoring.md +0 -118
  237. package/lib/assets/docs/article/getting-start-tdd/elixir/04-version-control-and-conventional-commits.md +0 -105
  238. package/lib/assets/docs/article/getting-start-tdd/elixir/05-package-management-and-static-analysis.md +0 -97
  239. package/lib/assets/docs/article/getting-start-tdd/elixir/06-task-runner-and-ci-cd.md +0 -80
  240. package/lib/assets/docs/article/getting-start-tdd/elixir/07-structs-and-protocols.md +0 -119
  241. package/lib/assets/docs/article/getting-start-tdd/elixir/08-pattern-matching-and-guards.md +0 -117
  242. package/lib/assets/docs/article/getting-start-tdd/elixir/09-module-design-and-behaviours.md +0 -113
  243. package/lib/assets/docs/article/getting-start-tdd/elixir/10-higher-order-functions-and-pipeline.md +0 -187
  244. package/lib/assets/docs/article/getting-start-tdd/elixir/11-stream-and-lazy-evaluation.md +0 -151
  245. package/lib/assets/docs/article/getting-start-tdd/elixir/12-error-handling-and-with.md +0 -154
  246. package/lib/assets/docs/article/getting-start-tdd/elixir/index.md +0 -35
  247. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter01.md +0 -211
  248. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter02.md +0 -255
  249. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter03.md +0 -227
  250. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter04.md +0 -188
  251. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter05.md +0 -276
  252. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter06.md +0 -199
  253. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter07.md +0 -170
  254. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter08.md +0 -184
  255. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter09.md +0 -231
  256. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter10.md +0 -198
  257. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter11.md +0 -221
  258. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter12.md +0 -224
  259. package/lib/assets/docs/article/getting-start-tdd/fsharp/index.md +0 -71
  260. package/lib/assets/docs/article/getting-start-tdd/go/01-todo-list-and-first-test.md +0 -222
  261. package/lib/assets/docs/article/getting-start-tdd/go/02-fake-it-and-triangulation.md +0 -311
  262. package/lib/assets/docs/article/getting-start-tdd/go/03-obvious-implementation-and-refactoring.md +0 -348
  263. package/lib/assets/docs/article/getting-start-tdd/go/04-version-control-and-conventional-commits.md +0 -121
  264. package/lib/assets/docs/article/getting-start-tdd/go/05-package-management-and-static-analysis.md +0 -281
  265. package/lib/assets/docs/article/getting-start-tdd/go/06-task-runner-and-ci-cd.md +0 -242
  266. package/lib/assets/docs/article/getting-start-tdd/go/07-encapsulation-and-polymorphism.md +0 -402
  267. package/lib/assets/docs/article/getting-start-tdd/go/08-design-patterns.md +0 -430
  268. package/lib/assets/docs/article/getting-start-tdd/go/09-solid-principles-and-module-design.md +0 -408
  269. package/lib/assets/docs/article/getting-start-tdd/go/10-higher-order-functions-and-composition.md +0 -234
  270. package/lib/assets/docs/article/getting-start-tdd/go/11-immutable-data-and-pipeline.md +0 -304
  271. package/lib/assets/docs/article/getting-start-tdd/go/12-error-handling-and-type-safety.md +0 -419
  272. package/lib/assets/docs/article/getting-start-tdd/go/index.md +0 -83
  273. package/lib/assets/docs/article/getting-start-tdd/haskell/01-todo-list-and-first-test.md +0 -288
  274. package/lib/assets/docs/article/getting-start-tdd/haskell/02-fake-it-and-triangulation.md +0 -346
  275. package/lib/assets/docs/article/getting-start-tdd/haskell/03-obvious-implementation-and-refactoring.md +0 -266
  276. package/lib/assets/docs/article/getting-start-tdd/haskell/04-version-control-and-conventional-commits.md +0 -191
  277. package/lib/assets/docs/article/getting-start-tdd/haskell/05-package-management-and-static-analysis.md +0 -322
  278. package/lib/assets/docs/article/getting-start-tdd/haskell/06-task-runner-and-ci-cd.md +0 -318
  279. package/lib/assets/docs/article/getting-start-tdd/haskell/07-algebraic-data-types-and-type-classes.md +0 -421
  280. package/lib/assets/docs/article/getting-start-tdd/haskell/08-pattern-matching-and-guards.md +0 -399
  281. package/lib/assets/docs/article/getting-start-tdd/haskell/09-module-design-and-smart-constructors.md +0 -470
  282. package/lib/assets/docs/article/getting-start-tdd/haskell/10-higher-order-functions-and-currying.md +0 -443
  283. package/lib/assets/docs/article/getting-start-tdd/haskell/11-function-composition-and-point-free.md +0 -401
  284. package/lib/assets/docs/article/getting-start-tdd/haskell/12-monad-and-error-handling.md +0 -640
  285. package/lib/assets/docs/article/getting-start-tdd/haskell/index.md +0 -49
  286. package/lib/assets/docs/article/getting-start-tdd/index.md +0 -93
  287. package/lib/assets/docs/article/getting-start-tdd/integration/01-language-overview.md +0 -384
  288. package/lib/assets/docs/article/getting-start-tdd/integration/02-test-framework-comparison.md +0 -358
  289. package/lib/assets/docs/article/getting-start-tdd/integration/03-tdd-pattern-comparison.md +0 -454
  290. package/lib/assets/docs/article/getting-start-tdd/integration/04-type-system-comparison.md +0 -418
  291. package/lib/assets/docs/article/getting-start-tdd/integration/05-dev-environment-comparison.md +0 -339
  292. package/lib/assets/docs/article/getting-start-tdd/integration/06-learning-roadmap.md +0 -299
  293. package/lib/assets/docs/article/getting-start-tdd/integration/index.md +0 -69
  294. package/lib/assets/docs/article/getting-start-tdd/java/01-todo-list-and-first-test.md +0 -243
  295. package/lib/assets/docs/article/getting-start-tdd/java/02-fake-it-and-triangulation.md +0 -270
  296. package/lib/assets/docs/article/getting-start-tdd/java/03-obvious-implementation-and-refactoring.md +0 -194
  297. package/lib/assets/docs/article/getting-start-tdd/java/04-version-control-and-conventional-commits.md +0 -124
  298. package/lib/assets/docs/article/getting-start-tdd/java/05-package-management-and-static-analysis.md +0 -391
  299. package/lib/assets/docs/article/getting-start-tdd/java/06-task-runner-and-ci-cd.md +0 -281
  300. package/lib/assets/docs/article/getting-start-tdd/java/07-encapsulation-and-polymorphism.md +0 -635
  301. package/lib/assets/docs/article/getting-start-tdd/java/08-design-patterns.md +0 -402
  302. package/lib/assets/docs/article/getting-start-tdd/java/09-solid-principles-and-module-design.md +0 -319
  303. package/lib/assets/docs/article/getting-start-tdd/java/10-higher-order-functions-and-composition.md +0 -197
  304. package/lib/assets/docs/article/getting-start-tdd/java/11-immutable-data-and-pipeline.md +0 -176
  305. package/lib/assets/docs/article/getting-start-tdd/java/12-error-handling-and-type-safety.md +0 -214
  306. package/lib/assets/docs/article/getting-start-tdd/java/index.md +0 -61
  307. package/lib/assets/docs/article/getting-start-tdd/node/01-todo-list-and-first-test.md +0 -253
  308. package/lib/assets/docs/article/getting-start-tdd/node/02-fake-it-and-triangulation.md +0 -271
  309. package/lib/assets/docs/article/getting-start-tdd/node/03-obvious-implementation-and-refactoring.md +0 -178
  310. package/lib/assets/docs/article/getting-start-tdd/node/04-version-control-and-conventional-commits.md +0 -121
  311. package/lib/assets/docs/article/getting-start-tdd/node/05-package-management-and-static-analysis.md +0 -323
  312. package/lib/assets/docs/article/getting-start-tdd/node/06-task-runner-and-ci-cd.md +0 -244
  313. package/lib/assets/docs/article/getting-start-tdd/node/07-encapsulation-and-polymorphism.md +0 -336
  314. package/lib/assets/docs/article/getting-start-tdd/node/08-design-patterns.md +0 -331
  315. package/lib/assets/docs/article/getting-start-tdd/node/09-solid-principles-and-module-design.md +0 -294
  316. package/lib/assets/docs/article/getting-start-tdd/node/10-higher-order-functions-and-composition.md +0 -208
  317. package/lib/assets/docs/article/getting-start-tdd/node/11-immutable-data-and-pipeline.md +0 -216
  318. package/lib/assets/docs/article/getting-start-tdd/node/12-error-handling-and-type-safety.md +0 -304
  319. package/lib/assets/docs/article/getting-start-tdd/node/index.md +0 -56
  320. package/lib/assets/docs/article/getting-start-tdd/php/01-todo-list-and-first-test.md +0 -268
  321. package/lib/assets/docs/article/getting-start-tdd/php/02-fake-it-and-triangulation.md +0 -209
  322. package/lib/assets/docs/article/getting-start-tdd/php/03-obvious-implementation-and-refactoring.md +0 -257
  323. package/lib/assets/docs/article/getting-start-tdd/php/04-version-control-and-conventional-commits.md +0 -150
  324. package/lib/assets/docs/article/getting-start-tdd/php/05-package-management-and-static-analysis.md +0 -419
  325. package/lib/assets/docs/article/getting-start-tdd/php/06-task-runner-and-ci-cd.md +0 -330
  326. package/lib/assets/docs/article/getting-start-tdd/php/07-encapsulation-and-polymorphism.md +0 -380
  327. package/lib/assets/docs/article/getting-start-tdd/php/08-design-patterns.md +0 -461
  328. package/lib/assets/docs/article/getting-start-tdd/php/09-solid-principles-and-module-design.md +0 -468
  329. package/lib/assets/docs/article/getting-start-tdd/php/10-higher-order-functions-and-composition.md +0 -190
  330. package/lib/assets/docs/article/getting-start-tdd/php/11-immutable-data-and-pipeline.md +0 -274
  331. package/lib/assets/docs/article/getting-start-tdd/php/12-error-handling-and-type-safety.md +0 -316
  332. package/lib/assets/docs/article/getting-start-tdd/php/index.md +0 -84
  333. package/lib/assets/docs/article/getting-start-tdd/python/01-todo-list-and-first-test.md +0 -210
  334. package/lib/assets/docs/article/getting-start-tdd/python/02-fake-it-and-triangulation.md +0 -256
  335. package/lib/assets/docs/article/getting-start-tdd/python/03-obvious-implementation-and-refactoring.md +0 -208
  336. package/lib/assets/docs/article/getting-start-tdd/python/04-version-control-and-conventional-commits.md +0 -96
  337. package/lib/assets/docs/article/getting-start-tdd/python/05-package-management-and-static-analysis.md +0 -283
  338. package/lib/assets/docs/article/getting-start-tdd/python/06-task-runner-and-ci-cd.md +0 -199
  339. package/lib/assets/docs/article/getting-start-tdd/python/07-encapsulation-and-polymorphism.md +0 -217
  340. package/lib/assets/docs/article/getting-start-tdd/python/08-design-patterns.md +0 -181
  341. package/lib/assets/docs/article/getting-start-tdd/python/09-solid-principles-and-module-design.md +0 -139
  342. package/lib/assets/docs/article/getting-start-tdd/python/10-higher-order-functions-and-composition.md +0 -131
  343. package/lib/assets/docs/article/getting-start-tdd/python/11-immutable-data-and-pipeline.md +0 -125
  344. package/lib/assets/docs/article/getting-start-tdd/python/12-error-handling-and-type-safety.md +0 -135
  345. package/lib/assets/docs/article/getting-start-tdd/python/index.md +0 -55
  346. package/lib/assets/docs/article/getting-start-tdd/ruby/01-todo-list-and-first-test.md +0 -240
  347. package/lib/assets/docs/article/getting-start-tdd/ruby/02-fake-it-and-triangulation.md +0 -247
  348. package/lib/assets/docs/article/getting-start-tdd/ruby/03-obvious-implementation-and-refactoring.md +0 -237
  349. package/lib/assets/docs/article/getting-start-tdd/ruby/04-version-control-and-conventional-commits.md +0 -121
  350. package/lib/assets/docs/article/getting-start-tdd/ruby/05-package-management-and-static-analysis.md +0 -296
  351. package/lib/assets/docs/article/getting-start-tdd/ruby/06-task-runner-and-ci-cd.md +0 -257
  352. package/lib/assets/docs/article/getting-start-tdd/ruby/07-encapsulation-and-polymorphism.md +0 -288
  353. package/lib/assets/docs/article/getting-start-tdd/ruby/08-design-patterns.md +0 -338
  354. package/lib/assets/docs/article/getting-start-tdd/ruby/09-solid-principles-and-module-design.md +0 -205
  355. package/lib/assets/docs/article/getting-start-tdd/ruby/10-higher-order-functions-and-composition.md +0 -184
  356. package/lib/assets/docs/article/getting-start-tdd/ruby/11-immutable-data-and-pipeline.md +0 -246
  357. package/lib/assets/docs/article/getting-start-tdd/ruby/12-error-handling-and-type-safety.md +0 -407
  358. package/lib/assets/docs/article/getting-start-tdd/ruby/index.md +0 -83
  359. package/lib/assets/docs/article/getting-start-tdd/rust/01-todo-list-and-first-test.md +0 -220
  360. package/lib/assets/docs/article/getting-start-tdd/rust/02-fake-it-and-triangulation.md +0 -273
  361. package/lib/assets/docs/article/getting-start-tdd/rust/03-obvious-implementation-and-refactoring.md +0 -242
  362. package/lib/assets/docs/article/getting-start-tdd/rust/04-version-control-and-conventional-commits.md +0 -101
  363. package/lib/assets/docs/article/getting-start-tdd/rust/05-package-management-and-static-analysis.md +0 -221
  364. package/lib/assets/docs/article/getting-start-tdd/rust/06-task-runner-and-ci-cd.md +0 -173
  365. package/lib/assets/docs/article/getting-start-tdd/rust/07-encapsulation-and-polymorphism.md +0 -151
  366. package/lib/assets/docs/article/getting-start-tdd/rust/08-design-patterns.md +0 -154
  367. package/lib/assets/docs/article/getting-start-tdd/rust/09-solid-principles-and-module-design.md +0 -119
  368. package/lib/assets/docs/article/getting-start-tdd/rust/10-higher-order-functions-and-composition.md +0 -103
  369. package/lib/assets/docs/article/getting-start-tdd/rust/11-immutable-data-and-pipeline.md +0 -114
  370. package/lib/assets/docs/article/getting-start-tdd/rust/12-error-handling-and-type-safety.md +0 -121
  371. package/lib/assets/docs/article/getting-start-tdd/rust/index.md +0 -83
  372. package/lib/assets/docs/article/getting-start-tdd/scala/01-todo-list-and-first-test.md +0 -120
  373. package/lib/assets/docs/article/getting-start-tdd/scala/02-fake-it-and-triangulation.md +0 -116
  374. package/lib/assets/docs/article/getting-start-tdd/scala/03-obvious-implementation-and-refactoring.md +0 -108
  375. package/lib/assets/docs/article/getting-start-tdd/scala/04-version-control-and-conventional-commits.md +0 -132
  376. package/lib/assets/docs/article/getting-start-tdd/scala/05-package-management-and-static-analysis.md +0 -205
  377. package/lib/assets/docs/article/getting-start-tdd/scala/06-task-runner-and-ci-cd.md +0 -195
  378. package/lib/assets/docs/article/getting-start-tdd/scala/07-case-classes-and-traits.md +0 -148
  379. package/lib/assets/docs/article/getting-start-tdd/scala/08-pattern-matching-and-sealed-traits.md +0 -115
  380. package/lib/assets/docs/article/getting-start-tdd/scala/09-packages-and-module-design.md +0 -84
  381. package/lib/assets/docs/article/getting-start-tdd/scala/10-higher-order-functions-and-composition.md +0 -113
  382. package/lib/assets/docs/article/getting-start-tdd/scala/11-collections-and-lazy-evaluation.md +0 -103
  383. package/lib/assets/docs/article/getting-start-tdd/scala/12-error-handling-and-type-safety.md +0 -101
  384. package/lib/assets/docs/article/getting-start-tdd/scala/index.md +0 -65
  385. package/lib/assets/docs/article/grokking-concurrency/all/index.md +0 -403
  386. package/lib/assets/docs/article/grokking-concurrency/all/part-1-ch02-sequential.md +0 -563
  387. package/lib/assets/docs/article/grokking-concurrency/all/part-2-ch04-05-threads.md +0 -478
  388. package/lib/assets/docs/article/grokking-concurrency/all/part-3-ch06-multitasking.md +0 -529
  389. package/lib/assets/docs/article/grokking-concurrency/all/part-4-ch07-parallel-patterns.md +0 -429
  390. package/lib/assets/docs/article/grokking-concurrency/all/part-5-ch08-09-synchronization.md +0 -519
  391. package/lib/assets/docs/article/grokking-concurrency/all/part-6-ch10-11-nonblocking-io.md +0 -444
  392. package/lib/assets/docs/article/grokking-concurrency/all/part-7-ch12-async.md +0 -474
  393. package/lib/assets/docs/article/grokking-concurrency/all/part-8-ch13-mapreduce.md +0 -386
  394. package/lib/assets/docs/article/grokking-concurrency/clojure/index.md +0 -106
  395. package/lib/assets/docs/article/grokking-concurrency/clojure/part-1.md +0 -107
  396. package/lib/assets/docs/article/grokking-concurrency/clojure/part-2.md +0 -100
  397. package/lib/assets/docs/article/grokking-concurrency/clojure/part-3.md +0 -121
  398. package/lib/assets/docs/article/grokking-concurrency/clojure/part-4.md +0 -122
  399. package/lib/assets/docs/article/grokking-concurrency/clojure/part-5.md +0 -117
  400. package/lib/assets/docs/article/grokking-concurrency/clojure/part-6.md +0 -88
  401. package/lib/assets/docs/article/grokking-concurrency/clojure/part-7.md +0 -99
  402. package/lib/assets/docs/article/grokking-concurrency/clojure/part-8.md +0 -119
  403. package/lib/assets/docs/article/grokking-concurrency/csharp/index.md +0 -91
  404. package/lib/assets/docs/article/grokking-concurrency/csharp/part-1.md +0 -96
  405. package/lib/assets/docs/article/grokking-concurrency/csharp/part-2.md +0 -122
  406. package/lib/assets/docs/article/grokking-concurrency/csharp/part-3.md +0 -100
  407. package/lib/assets/docs/article/grokking-concurrency/csharp/part-4.md +0 -111
  408. package/lib/assets/docs/article/grokking-concurrency/csharp/part-5.md +0 -98
  409. package/lib/assets/docs/article/grokking-concurrency/csharp/part-6.md +0 -60
  410. package/lib/assets/docs/article/grokking-concurrency/csharp/part-7.md +0 -83
  411. package/lib/assets/docs/article/grokking-concurrency/csharp/part-8.md +0 -91
  412. package/lib/assets/docs/article/grokking-concurrency/fsharp/index.md +0 -55
  413. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-1.md +0 -79
  414. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-2.md +0 -102
  415. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-3.md +0 -93
  416. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-4.md +0 -109
  417. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-5.md +0 -103
  418. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-6.md +0 -92
  419. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-7.md +0 -120
  420. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-8.md +0 -106
  421. package/lib/assets/docs/article/grokking-concurrency/haskell/index.md +0 -238
  422. package/lib/assets/docs/article/grokking-concurrency/haskell/part-1.md +0 -95
  423. package/lib/assets/docs/article/grokking-concurrency/haskell/part-2.md +0 -95
  424. package/lib/assets/docs/article/grokking-concurrency/haskell/part-3.md +0 -90
  425. package/lib/assets/docs/article/grokking-concurrency/haskell/part-4.md +0 -105
  426. package/lib/assets/docs/article/grokking-concurrency/haskell/part-5.md +0 -98
  427. package/lib/assets/docs/article/grokking-concurrency/haskell/part-6.md +0 -94
  428. package/lib/assets/docs/article/grokking-concurrency/haskell/part-7.md +0 -110
  429. package/lib/assets/docs/article/grokking-concurrency/haskell/part-8.md +0 -117
  430. package/lib/assets/docs/article/grokking-concurrency/index.md +0 -66
  431. package/lib/assets/docs/article/grokking-concurrency/java/index.md +0 -92
  432. package/lib/assets/docs/article/grokking-concurrency/java/part-1.md +0 -307
  433. package/lib/assets/docs/article/grokking-concurrency/java/part-2.md +0 -333
  434. package/lib/assets/docs/article/grokking-concurrency/java/part-3.md +0 -220
  435. package/lib/assets/docs/article/grokking-concurrency/java/part-4.md +0 -212
  436. package/lib/assets/docs/article/grokking-concurrency/java/part-5.md +0 -111
  437. package/lib/assets/docs/article/grokking-concurrency/java/part-6.md +0 -68
  438. package/lib/assets/docs/article/grokking-concurrency/java/part-7.md +0 -100
  439. package/lib/assets/docs/article/grokking-concurrency/java/part-8.md +0 -100
  440. package/lib/assets/docs/article/grokking-concurrency/python/index.md +0 -303
  441. package/lib/assets/docs/article/grokking-concurrency/python/part-1.md +0 -238
  442. package/lib/assets/docs/article/grokking-concurrency/python/part-2.md +0 -417
  443. package/lib/assets/docs/article/grokking-concurrency/python/part-3.md +0 -226
  444. package/lib/assets/docs/article/grokking-concurrency/python/part-4.md +0 -298
  445. package/lib/assets/docs/article/grokking-concurrency/python/part-5.md +0 -314
  446. package/lib/assets/docs/article/grokking-concurrency/python/part-6.md +0 -296
  447. package/lib/assets/docs/article/grokking-concurrency/python/part-7.md +0 -313
  448. package/lib/assets/docs/article/grokking-concurrency/python/part-8.md +0 -359
  449. package/lib/assets/docs/article/grokking-concurrency/rust/index.md +0 -260
  450. package/lib/assets/docs/article/grokking-concurrency/rust/part-1.md +0 -107
  451. package/lib/assets/docs/article/grokking-concurrency/rust/part-2.md +0 -119
  452. package/lib/assets/docs/article/grokking-concurrency/rust/part-3.md +0 -125
  453. package/lib/assets/docs/article/grokking-concurrency/rust/part-4.md +0 -174
  454. package/lib/assets/docs/article/grokking-concurrency/rust/part-5.md +0 -157
  455. package/lib/assets/docs/article/grokking-concurrency/rust/part-6.md +0 -93
  456. package/lib/assets/docs/article/grokking-concurrency/rust/part-7.md +0 -132
  457. package/lib/assets/docs/article/grokking-concurrency/rust/part-8.md +0 -154
  458. package/lib/assets/docs/article/grokking-concurrency/scala/index.md +0 -59
  459. package/lib/assets/docs/article/grokking-concurrency/scala/part-1.md +0 -77
  460. package/lib/assets/docs/article/grokking-concurrency/scala/part-2.md +0 -111
  461. package/lib/assets/docs/article/grokking-concurrency/scala/part-3.md +0 -92
  462. package/lib/assets/docs/article/grokking-concurrency/scala/part-4.md +0 -109
  463. package/lib/assets/docs/article/grokking-concurrency/scala/part-5.md +0 -118
  464. package/lib/assets/docs/article/grokking-concurrency/scala/part-6.md +0 -82
  465. package/lib/assets/docs/article/grokking-concurrency/scala/part-7.md +0 -130
  466. package/lib/assets/docs/article/grokking-concurrency/scala/part-8.md +0 -128
  467. package/lib/assets/docs/article/grokkingfp/all/index.md +0 -368
  468. package/lib/assets/docs/article/grokkingfp/all/part-1-ch01-fp-introduction.md +0 -539
  469. package/lib/assets/docs/article/grokkingfp/all/part-1-ch02-pure-functions.md +0 -932
  470. package/lib/assets/docs/article/grokkingfp/all/part-2-ch03-immutable-data.md +0 -1137
  471. package/lib/assets/docs/article/grokkingfp/all/part-2-ch04-higher-order-functions.md +0 -1113
  472. package/lib/assets/docs/article/grokkingfp/all/part-2-ch05-flatmap.md +0 -1035
  473. package/lib/assets/docs/article/grokkingfp/all/part-3-ch06-option.md +0 -794
  474. package/lib/assets/docs/article/grokkingfp/all/part-3-ch07-either-adt.md +0 -880
  475. package/lib/assets/docs/article/grokkingfp/all/part-4-ch08-io-monad.md +0 -981
  476. package/lib/assets/docs/article/grokkingfp/all/part-4-ch09-streams.md +0 -935
  477. package/lib/assets/docs/article/grokkingfp/all/part-5-ch10-concurrency.md +0 -879
  478. package/lib/assets/docs/article/grokkingfp/all/part-6-ch11-application.md +0 -724
  479. package/lib/assets/docs/article/grokkingfp/all/part-6-ch12-testing.md +0 -635
  480. package/lib/assets/docs/article/grokkingfp/all/writing-plan.md +0 -721
  481. package/lib/assets/docs/article/grokkingfp/clojure/index.md +0 -276
  482. package/lib/assets/docs/article/grokkingfp/clojure/part-1.md +0 -676
  483. package/lib/assets/docs/article/grokkingfp/clojure/part-2.md +0 -652
  484. package/lib/assets/docs/article/grokkingfp/clojure/part-3.md +0 -629
  485. package/lib/assets/docs/article/grokkingfp/clojure/part-4.md +0 -706
  486. package/lib/assets/docs/article/grokkingfp/clojure/part-5.md +0 -760
  487. package/lib/assets/docs/article/grokkingfp/clojure/part-6.md +0 -730
  488. package/lib/assets/docs/article/grokkingfp/csharp/index.md +0 -246
  489. package/lib/assets/docs/article/grokkingfp/csharp/part-1.md +0 -820
  490. package/lib/assets/docs/article/grokkingfp/csharp/part-2.md +0 -980
  491. package/lib/assets/docs/article/grokkingfp/csharp/part-3.md +0 -990
  492. package/lib/assets/docs/article/grokkingfp/csharp/part-4.md +0 -958
  493. package/lib/assets/docs/article/grokkingfp/csharp/part-5.md +0 -956
  494. package/lib/assets/docs/article/grokkingfp/csharp/part-6.md +0 -748
  495. package/lib/assets/docs/article/grokkingfp/elixir/index.md +0 -203
  496. package/lib/assets/docs/article/grokkingfp/elixir/part-1.md +0 -721
  497. package/lib/assets/docs/article/grokkingfp/elixir/part-2.md +0 -847
  498. package/lib/assets/docs/article/grokkingfp/elixir/part-3.md +0 -994
  499. package/lib/assets/docs/article/grokkingfp/elixir/part-4.md +0 -983
  500. package/lib/assets/docs/article/grokkingfp/elixir/part-5.md +0 -1295
  501. package/lib/assets/docs/article/grokkingfp/elixir/part-6.md +0 -1058
  502. package/lib/assets/docs/article/grokkingfp/fsharp/index.md +0 -210
  503. package/lib/assets/docs/article/grokkingfp/fsharp/part-1.md +0 -723
  504. package/lib/assets/docs/article/grokkingfp/fsharp/part-2.md +0 -970
  505. package/lib/assets/docs/article/grokkingfp/fsharp/part-3.md +0 -981
  506. package/lib/assets/docs/article/grokkingfp/fsharp/part-4.md +0 -841
  507. package/lib/assets/docs/article/grokkingfp/fsharp/part-5.md +0 -920
  508. package/lib/assets/docs/article/grokkingfp/fsharp/part-6.md +0 -931
  509. package/lib/assets/docs/article/grokkingfp/haskell/index.md +0 -234
  510. package/lib/assets/docs/article/grokkingfp/haskell/part-1.md +0 -600
  511. package/lib/assets/docs/article/grokkingfp/haskell/part-2.md +0 -875
  512. package/lib/assets/docs/article/grokkingfp/haskell/part-3.md +0 -924
  513. package/lib/assets/docs/article/grokkingfp/haskell/part-4.md +0 -887
  514. package/lib/assets/docs/article/grokkingfp/haskell/part-5.md +0 -854
  515. package/lib/assets/docs/article/grokkingfp/haskell/part-6.md +0 -853
  516. package/lib/assets/docs/article/grokkingfp/index.md +0 -143
  517. package/lib/assets/docs/article/grokkingfp/java/index.md +0 -211
  518. package/lib/assets/docs/article/grokkingfp/java/part-1.md +0 -657
  519. package/lib/assets/docs/article/grokkingfp/java/part-2.md +0 -684
  520. package/lib/assets/docs/article/grokkingfp/java/part-3.md +0 -681
  521. package/lib/assets/docs/article/grokkingfp/java/part-4.md +0 -780
  522. package/lib/assets/docs/article/grokkingfp/java/part-5.md +0 -968
  523. package/lib/assets/docs/article/grokkingfp/java/part-6.md +0 -1337
  524. package/lib/assets/docs/article/grokkingfp/python/index.md +0 -258
  525. package/lib/assets/docs/article/grokkingfp/python/part-1.md +0 -452
  526. package/lib/assets/docs/article/grokkingfp/python/part-2.md +0 -967
  527. package/lib/assets/docs/article/grokkingfp/python/part-3.md +0 -1013
  528. package/lib/assets/docs/article/grokkingfp/python/part-4.md +0 -774
  529. package/lib/assets/docs/article/grokkingfp/python/part-5.md +0 -756
  530. package/lib/assets/docs/article/grokkingfp/python/part-6.md +0 -870
  531. package/lib/assets/docs/article/grokkingfp/ruby/index.md +0 -330
  532. package/lib/assets/docs/article/grokkingfp/ruby/part-1.md +0 -764
  533. package/lib/assets/docs/article/grokkingfp/ruby/part-2.md +0 -947
  534. package/lib/assets/docs/article/grokkingfp/ruby/part-3.md +0 -955
  535. package/lib/assets/docs/article/grokkingfp/ruby/part-4.md +0 -930
  536. package/lib/assets/docs/article/grokkingfp/ruby/part-5.md +0 -917
  537. package/lib/assets/docs/article/grokkingfp/ruby/part-6.md +0 -1421
  538. package/lib/assets/docs/article/grokkingfp/rust/index.md +0 -242
  539. package/lib/assets/docs/article/grokkingfp/rust/part-1.md +0 -643
  540. package/lib/assets/docs/article/grokkingfp/rust/part-2.md +0 -1069
  541. package/lib/assets/docs/article/grokkingfp/rust/part-3.md +0 -1003
  542. package/lib/assets/docs/article/grokkingfp/rust/part-4.md +0 -582
  543. package/lib/assets/docs/article/grokkingfp/rust/part-5.md +0 -714
  544. package/lib/assets/docs/article/grokkingfp/rust/part-6.md +0 -517
  545. package/lib/assets/docs/article/grokkingfp/scala/index.md +0 -171
  546. package/lib/assets/docs/article/grokkingfp/scala/part-1.md +0 -552
  547. package/lib/assets/docs/article/grokkingfp/scala/part-2.md +0 -955
  548. package/lib/assets/docs/article/grokkingfp/scala/part-3.md +0 -928
  549. package/lib/assets/docs/article/grokkingfp/scala/part-4.md +0 -751
  550. package/lib/assets/docs/article/grokkingfp/scala/part-5.md +0 -731
  551. package/lib/assets/docs/article/grokkingfp/scala/part-6.md +0 -876
  552. package/lib/assets/docs/article/grokkingfp/typescript/index.md +0 -273
  553. package/lib/assets/docs/article/grokkingfp/typescript/part-1.md +0 -570
  554. package/lib/assets/docs/article/grokkingfp/typescript/part-2.md +0 -1138
  555. package/lib/assets/docs/article/grokkingfp/typescript/part-3.md +0 -851
  556. package/lib/assets/docs/article/grokkingfp/typescript/part-4.md +0 -1096
  557. package/lib/assets/docs/article/grokkingfp/typescript/part-5.md +0 -726
  558. package/lib/assets/docs/article/grokkingfp/typescript/part-6.md +0 -991
  559. package/lib/assets/docs/article/practical-database-design/index.md +0 -121
  560. package/lib/assets/docs/article/practical-database-design/part1/chapter01.md +0 -297
  561. package/lib/assets/docs/article/practical-database-design/part1/chapter02.md +0 -527
  562. package/lib/assets/docs/article/practical-database-design/part1/chapter03.md +0 -566
  563. package/lib/assets/docs/article/practical-database-design/part2/chapter04.md +0 -933
  564. package/lib/assets/docs/article/practical-database-design/part2/chapter05.md +0 -1636
  565. package/lib/assets/docs/article/practical-database-design/part2/chapter06.md +0 -2725
  566. package/lib/assets/docs/article/practical-database-design/part2/chapter07.md +0 -2091
  567. package/lib/assets/docs/article/practical-database-design/part2/chapter08.md +0 -2114
  568. package/lib/assets/docs/article/practical-database-design/part2/chapter09.md +0 -2040
  569. package/lib/assets/docs/article/practical-database-design/part2/chapter10.md +0 -1396
  570. package/lib/assets/docs/article/practical-database-design/part2/chapter11.md +0 -1686
  571. package/lib/assets/docs/article/practical-database-design/part2/chapter12.md +0 -1426
  572. package/lib/assets/docs/article/practical-database-design/part2/chapter13.md +0 -1443
  573. package/lib/assets/docs/article/practical-database-design/part3/chapter14.md +0 -676
  574. package/lib/assets/docs/article/practical-database-design/part3/chapter15.md +0 -1634
  575. package/lib/assets/docs/article/practical-database-design/part3/chapter16.md +0 -1924
  576. package/lib/assets/docs/article/practical-database-design/part3/chapter17.md +0 -1717
  577. package/lib/assets/docs/article/practical-database-design/part3/chapter18.md +0 -2104
  578. package/lib/assets/docs/article/practical-database-design/part3/chapter19.md +0 -1132
  579. package/lib/assets/docs/article/practical-database-design/part3/chapter20.md +0 -1040
  580. package/lib/assets/docs/article/practical-database-design/part3/chapter21.md +0 -1391
  581. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter14-orm.md +0 -1000
  582. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter15-orm.md +0 -1309
  583. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter16-orm.md +0 -1175
  584. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter17-orm.md +0 -1593
  585. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter18-orm.md +0 -1192
  586. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter19-orm.md +0 -1025
  587. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter20-orm.md +0 -1762
  588. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter21-orm.md +0 -1456
  589. package/lib/assets/docs/article/practical-database-design/part3-orm/chapter22-orm.md +0 -1887
  590. package/lib/assets/docs/article/practical-database-design/part4/chapter22.md +0 -974
  591. package/lib/assets/docs/article/practical-database-design/part4/chapter23.md +0 -2078
  592. package/lib/assets/docs/article/practical-database-design/part4/chapter24.md +0 -2448
  593. package/lib/assets/docs/article/practical-database-design/part4/chapter25.md +0 -3670
  594. package/lib/assets/docs/article/practical-database-design/part4/chapter26.md +0 -2925
  595. package/lib/assets/docs/article/practical-database-design/part4/chapter27.md +0 -3114
  596. package/lib/assets/docs/article/practical-database-design/part4/chapter28.md +0 -2706
  597. package/lib/assets/docs/article/practical-database-design/part4/chapter29.md +0 -2552
  598. package/lib/assets/docs/article/practical-database-design/part4/chapter30.md +0 -2188
  599. package/lib/assets/docs/article/practical-database-design/part4/chapter31.md +0 -1200
  600. package/lib/assets/docs/article/practical-database-design/part4/chapter32.md +0 -2109
  601. package/lib/assets/docs/article/practical-database-design/part5/chapter33.md +0 -1041
  602. package/lib/assets/docs/article/practical-database-design/part5/chapter34.md +0 -1618
  603. package/lib/assets/docs/article/practical-database-design/part5/chapter35.md +0 -1462
  604. package/lib/assets/docs/article/practical-database-design/part5/chapter36.md +0 -1301
  605. package/lib/assets/docs/article/practical-database-design/part5/chapter37.md +0 -1479
  606. package/lib/assets/docs/article/practical-database-design/part5/chapter38.md +0 -1707
  607. package/lib/assets/docs/article/practical-database-design/part5/chapter39.md +0 -2343
  608. package/lib/assets/docs/article/practical-database-design/study/study2-1.md +0 -1702
  609. package/lib/assets/docs/article/practical-database-design/study/study2-2.md +0 -1356
  610. package/lib/assets/docs/article/practical-database-design/study/study2-3.md +0 -2053
  611. package/lib/assets/docs/article/practical-database-design/study/study2-4.md +0 -2238
  612. package/lib/assets/docs/article/practical-database-design/study/study2-5.md +0 -2427
  613. package/lib/assets/docs/article/practical-database-design/study/study3-1.md +0 -2214
  614. package/lib/assets/docs/article/practical-database-design/study/study3-2.md +0 -2230
  615. package/lib/assets/docs/article/practical-database-design/study/study3-3.md +0 -2262
  616. package/lib/assets/docs/article/practical-database-design/study/study3-4.md +0 -2115
  617. package/lib/assets/docs/article/practical-database-design/study/study3-5.md +0 -2516
  618. package/lib/assets/docs/article/practical-database-design/study/study4-1.md +0 -2596
  619. package/lib/assets/docs/article/practical-database-design/study/study4-2.md +0 -2084
  620. package/lib/assets/docs/article/practical-database-design/study/study4-3.md +0 -1814
  621. package/lib/assets/docs/article/practical-database-design/study/study4-4.md +0 -1904
  622. package/lib/assets/docs/article/practical-database-design/study/study4-5.md +0 -2887
@@ -1,880 +0,0 @@
1
- ---
2
- type: Article
3
- title: "Part III - 第 7 章:Either 型と代数的データ型"
4
- description: "前章で学んだ Option 型は、値の有無を型で表現する強力な手段でした。"
5
- tags: [article, grokkingfp, all]
6
- status: stable
7
- generated: { by: human:kakimomokuri, at: 2026-03-24T05:22:28Z }
8
- ---
9
-
10
- # Part III - 第 7 章:Either 型と代数的データ型
11
-
12
- ## 7.1 はじめに:Option の限界
13
-
14
- 前章で学んだ Option 型は、値の有無を型で表現する強力な手段でした。しかし、`None` は「なぜ失敗したか」の情報を持ちません。Either/Result 型は、失敗の理由をエラー値として保持し、より豊かなエラーハンドリングを実現します。
15
-
16
- さらに本章では、**代数的データ型**(ADT: Algebraic Data Type)を学びます。ADT は「直和型」と「直積型」の組み合わせで、ドメインの概念を正確にモデリングする関数型プログラミングの基盤です。
17
-
18
- 本章では、11 言語での Either/Result と ADT の実装を横断的に比較し、以下を明らかにします:
19
-
20
- - Either/Result の実装方式の違い(組み込み vs ライブラリ vs タプル/マップ)
21
- - ADT の表現方法(sealed trait, enum, 判別共用体, discriminated union)
22
- - パターンマッチの網羅性チェックの言語間差異
23
-
24
- ```plantuml
25
- @startuml
26
- !theme plain
27
-
28
- rectangle "Option" #LightYellow {
29
- card "Some(value)" as os
30
- card "None(理由なし)" as on
31
- }
32
-
33
- rectangle "Either / Result" #LightGreen {
34
- card "Right(value) / Ok(value)" as er
35
- card "Left(error) / Err(error)" as el
36
- }
37
-
38
- rectangle "ADT" #LightBlue {
39
- card "直和型(Sum Type)\nA | B | C" as sum
40
- card "直積型(Product Type)\nA × B × C" as prod
41
- }
42
-
43
- on -right-> el : "失敗の理由を追加"
44
-
45
- @enduml
46
- ```
47
-
48
- ---
49
-
50
- ## 7.2 共通の本質:Either = Right | Left
51
-
52
- 11 言語すべてに共通する Either/Result の構造は、**成功と失敗の 2 つのケース**を持つ型です:
53
-
54
- 1. **Right / Ok / Success**: 処理が成功し、値を保持する
55
- 2. **Left / Err / Failure**: 処理が失敗し、エラー情報を保持する
56
-
57
- 3 つの言語グループから代表例を見てみましょう:
58
-
59
- ```haskell
60
- -- Haskell: Either 型(言語組み込み)
61
- data Either e a = Left e | Right a
62
-
63
- -- 使用例
64
- extractName :: String -> Either String String
65
- extractName rawShow =
66
- case elemIndex '(' rawShow of
67
- Just idx | idx > 0 -> Right $ trim $ take idx rawShow
68
- _ -> Left $ "Can't extract name from " ++ rawShow
69
- ```
70
-
71
- ```rust
72
- // Rust: Result 型(言語組み込み)
73
- pub fn extract_name(raw_show: &str) -> Result<String, String> {
74
- let bracket_open = raw_show
75
- .find('(')
76
- .ok_or_else(|| format!("Can't find '(' in {}", raw_show))?;
77
-
78
- if bracket_open > 0 {
79
- Ok(raw_show[..bracket_open].trim().to_string())
80
- } else {
81
- Err(format!("Can't extract name from {}", raw_show))
82
- }
83
- }
84
- ```
85
-
86
- ```scala
87
- // Scala: Either 型(標準ライブラリ)
88
- def extractName(show: String): Either[String, String] = {
89
- val bracketOpen = show.indexOf('(')
90
- if (bracketOpen > 0) Right(show.substring(0, bracketOpen).trim)
91
- else Left(s"Can't extract name from $show")
92
- }
93
- ```
94
-
95
- ---
96
-
97
- ## 7.3 Either/Result の実装方式
98
-
99
- ### アプローチ 1: 言語組み込み
100
-
101
- | 言語 | 型名 | 成功 | 失敗 | 特徴 |
102
- |------|------|------|------|------|
103
- | **Haskell** | `Either e a` | `Right a` | `Left e` | 最も古典的な Either |
104
- | **Rust** | `Result<T, E>` | `Ok(T)` | `Err(E)` | `?` 演算子で簡潔な伝播 |
105
- | **F#** | `Result<'T, 'E>` | `Ok value` | `Error e` | パイプ + パターンマッチ |
106
-
107
- ### アプローチ 2: ライブラリ提供
108
-
109
- | 言語 | ライブラリ | 型名 | 成功 | 失敗 |
110
- |------|-----------|------|------|------|
111
- | **Scala** | 標準ライブラリ | `Either[E, A]` | `Right(a)` | `Left(e)` |
112
- | **Java** | Vavr | `Either<L, R>` | `Either.right(r)` | `Either.left(l)` |
113
- | **C#** | LanguageExt | `Either<L, R>` | `Right(r)` | `Left(l)` |
114
- | **TypeScript** | fp-ts | `Either<E, A>` | `E.right(a)` | `E.left(e)` |
115
- | **Python** | returns | `Result[T, E]` | `Success(t)` | `Failure(e)` |
116
- | **Ruby** | dry-monads | `Result` | `Success(t)` | `Failure(e)` |
117
-
118
- ### アプローチ 3: タプル / マップベース
119
-
120
- | 言語 | 構造 | 成功 | 失敗 |
121
- |------|------|------|------|
122
- | **Elixir** | タプル | `{:ok, value}` | `{:error, reason}` |
123
- | **Clojure** | マップ | `{:status :ok, :value v}` | `{:status :error, :error msg}` |
124
-
125
- ---
126
-
127
- ## 7.4 TV 番組パース:Either による合成
128
-
129
- Option 版と同じ TV 番組パースを Either で実装し、**失敗の理由**が伝播する様子を比較します。
130
-
131
- ### 代表 3 言語の比較
132
-
133
- **Haskell**: do 記法
134
-
135
- ```haskell
136
- parseShowE :: String -> Either String TvShow
137
- parseShowE rawShow = do
138
- name <- extractNameE rawShow
139
- yearStart <- extractYearStartE rawShow `orElseE` extractSingleYearE rawShow
140
- yearEnd <- extractYearEndE rawShow `orElseE` extractSingleYearE rawShow
141
- return $ TvShow name yearStart yearEnd
142
-
143
- -- 失敗例
144
- parseShowE "Invalid"
145
- -- Left "Can't extract name from Invalid"(失敗の理由が残る)
146
- ```
147
-
148
- **Scala**: for 内包表記
149
-
150
- ```scala
151
- def parseShow(rawShow: String): Either[String, TvShow] =
152
- for {
153
- name <- extractName(rawShow)
154
- yearStart <- extractYearStart(rawShow).orElse(extractSingleYear(rawShow))
155
- yearEnd <- extractYearEnd(rawShow).orElse(extractSingleYear(rawShow))
156
- } yield TvShow(name, yearStart, yearEnd)
157
-
158
- // 失敗例
159
- parseShow("Invalid")
160
- // Left("Can't extract name from Invalid")
161
- ```
162
-
163
- **Rust**: ? 演算子
164
-
165
- ```rust
166
- pub fn parse_show(raw_show: &str) -> Result<TvShow, String> {
167
- let name = extract_name(raw_show)?;
168
- let year_start = extract_year_start(raw_show)
169
- .or_else(|_| extract_single_year(raw_show))?;
170
- let year_end = extract_year_end(raw_show)
171
- .or_else(|_| extract_single_year(raw_show))?;
172
-
173
- Ok(TvShow::new(&name, year_start, year_end))
174
- }
175
-
176
- // 失敗例
177
- parse_show("Invalid")
178
- // Err("Can't extract name from Invalid")
179
- ```
180
-
181
- ### 全 11 言語の実装
182
-
183
- #### 関数型ファースト言語
184
-
185
- <details>
186
- <summary>Haskell 実装</summary>
187
-
188
- ```haskell
189
- parseShowE :: String -> Either String TvShow
190
- parseShowE rawShow = do
191
- name <- extractNameE rawShow
192
- yearStart <- extractYearStartE rawShow `orElseE` extractSingleYearE rawShow
193
- yearEnd <- extractYearEndE rawShow `orElseE` extractSingleYearE rawShow
194
- return $ TvShow name yearStart yearEnd
195
- ```
196
-
197
- Haskell の `Either` は `Monad` インスタンスを持ち、do 記法で `Maybe` と同じように合成できます。
198
-
199
- </details>
200
-
201
- <details>
202
- <summary>Clojure 実装</summary>
203
-
204
- ```clojure
205
- (defn ok [value] {:status :ok :value value})
206
- (defn error [message] {:status :error :error message})
207
-
208
- (defn result-flatmap [f result]
209
- (if (= (:status result) :ok)
210
- (f (:value result))
211
- result))
212
-
213
- (defn parse-show-result [raw-show]
214
- (result-flatmap
215
- (fn [name]
216
- (let [year-start (result-or-else
217
- (extract-year-start-result raw-show)
218
- #(extract-single-year-result raw-show))
219
- year-end (result-or-else
220
- (extract-year-end-result raw-show)
221
- #(extract-single-year-result raw-show))]
222
- (result-flatmap
223
- (fn [ys]
224
- (result-flatmap
225
- (fn [ye] (ok {:title name :start ys :end ye}))
226
- year-end))
227
- year-start)))
228
- (extract-name-result raw-show)))
229
- ```
230
-
231
- Clojure では専用の型を持たないため、マップベースの Result パターンと `result-flatmap` 関数を手動で実装します。
232
-
233
- </details>
234
-
235
- <details>
236
- <summary>Elixir 実装</summary>
237
-
238
- ```elixir
239
- def parse_show(raw_show) do
240
- with {:ok, name} <- extract_name(raw_show),
241
- {:ok, year_start} <- or_else(extract_year_start(raw_show),
242
- fn -> extract_single_year(raw_show) end),
243
- {:ok, year_end} <- or_else(extract_year_end(raw_show),
244
- fn -> extract_single_year(raw_show) end) do
245
- {:ok, %TvShow{title: name, start: year_start, end_year: year_end}}
246
- end
247
- end
248
- ```
249
-
250
- Elixir の `with` 式は、パターンマッチが失敗すると最初の不一致を返します。`{:ok, value}` / `{:error, reason}` のタプルパターンは Erlang/OTP の伝統です。
251
-
252
- </details>
253
-
254
- <details>
255
- <summary>F# 実装</summary>
256
-
257
- ```fsharp
258
- let parseShow (rawShow: string) : Result<TvShow, string> =
259
- match extractName rawShow with
260
- | Error e -> Error e
261
- | Ok name ->
262
- let yearStart =
263
- extractYearStart rawShow
264
- |> Result.orElse (extractSingleYear rawShow)
265
- let yearEnd =
266
- extractYearEnd rawShow
267
- |> Result.orElse (extractSingleYear rawShow)
268
- match yearStart, yearEnd with
269
- | Ok start, Ok endYear ->
270
- Ok { Title = name; Start = start; End = endYear }
271
- | Error e, _ -> Error e
272
- | _, Error e -> Error e
273
- ```
274
-
275
- F# ではパターンマッチで `Ok` / `Error` を明示的に処理します。
276
-
277
- </details>
278
-
279
- #### マルチパラダイム言語
280
-
281
- <details>
282
- <summary>Scala 実装</summary>
283
-
284
- ```scala
285
- def parseShow(rawShow: String): Either[String, TvShow] =
286
- for {
287
- name <- extractName(rawShow)
288
- yearStart <- extractYearStart(rawShow).orElse(extractSingleYear(rawShow))
289
- yearEnd <- extractYearEnd(rawShow).orElse(extractSingleYear(rawShow))
290
- } yield TvShow(name, yearStart, yearEnd)
291
- ```
292
-
293
- </details>
294
-
295
- <details>
296
- <summary>Rust 実装</summary>
297
-
298
- ```rust
299
- pub fn parse_show(raw_show: &str) -> Result<TvShow, String> {
300
- let name = extract_name(raw_show)?;
301
- let year_start = extract_year_start(raw_show)
302
- .or_else(|_| extract_single_year(raw_show))?;
303
- let year_end = extract_year_end(raw_show)
304
- .or_else(|_| extract_single_year(raw_show))?;
305
-
306
- Ok(TvShow::new(&name, year_start, year_end))
307
- }
308
- ```
309
-
310
- Rust の `?` 演算子は `Option` と `Result` の両方で使えます。`or_else(|_| ...)` のクロージャ引数 `_` はエラー値を無視することを示します。
311
-
312
- </details>
313
-
314
- <details>
315
- <summary>TypeScript (fp-ts) 実装</summary>
316
-
317
- ```typescript
318
- import * as E from 'fp-ts/Either'
319
-
320
- const parseShow = (rawShow: string): E.Either<string, TvShow> =>
321
- pipe(
322
- E.Do,
323
- E.bind('name', () => extractName(rawShow)),
324
- E.bind('start', () =>
325
- pipe(
326
- extractYearStart(rawShow),
327
- E.orElse(() => extractSingleYear(rawShow))
328
- )
329
- ),
330
- E.bind('end', () =>
331
- pipe(
332
- extractYearEnd(rawShow),
333
- E.orElse(() => extractSingleYear(rawShow))
334
- )
335
- ),
336
- E.map(({ name, start, end }) => ({ title: name, start, end }))
337
- )
338
- ```
339
-
340
- </details>
341
-
342
- #### OOP + FP ライブラリ言語
343
-
344
- <details>
345
- <summary>Java (Vavr) 実装</summary>
346
-
347
- ```java
348
- public static Either<String, TvShow> parseShow(String rawShow) {
349
- return extractName(rawShow).flatMap(name ->
350
- extractYearStart(rawShow).orElse(() -> extractSingleYear(rawShow))
351
- .flatMap(yearStart ->
352
- extractYearEnd(rawShow).orElse(() -> extractSingleYear(rawShow))
353
- .map(yearEnd -> new TvShow(name, yearStart, yearEnd))
354
- )
355
- );
356
- }
357
- ```
358
-
359
- </details>
360
-
361
- <details>
362
- <summary>C# (LanguageExt) 実装</summary>
363
-
364
- ```csharp
365
- Either<string, TvShow> ParseShow(string rawShow) =>
366
- from name in ExtractName(rawShow)
367
- from yearStart in ExtractYearStart(rawShow) || ExtractSingleYear(rawShow)
368
- from yearEnd in ExtractYearEnd(rawShow) || ExtractSingleYear(rawShow)
369
- select new TvShow(name, yearStart, yearEnd);
370
- ```
371
-
372
- C# の LINQ + `||` 演算子で Scala の for 内包表記に匹敵する簡潔さを実現しています。
373
-
374
- </details>
375
-
376
- <details>
377
- <summary>Python (returns) 実装</summary>
378
-
379
- ```python
380
- from returns.result import Result, Success, Failure
381
-
382
- def parse_show(raw_show: str) -> Result[TvShow, str]:
383
- name = extract_name_result(raw_show)
384
- year_start = extract_year_start_result(raw_show).lash(
385
- lambda _: extract_single_year_result(raw_show)
386
- )
387
- year_end = extract_year_end_result(raw_show).lash(
388
- lambda _: extract_single_year_result(raw_show)
389
- )
390
-
391
- return name.bind(
392
- lambda n: year_start.bind(
393
- lambda s: year_end.map(lambda e: TvShow(n, s, e))
394
- )
395
- )
396
- ```
397
-
398
- </details>
399
-
400
- <details>
401
- <summary>Ruby (dry-monads) 実装</summary>
402
-
403
- ```ruby
404
- def parse_show(raw_show)
405
- name = extract_name(raw_show)
406
- year_start = extract_year_start(raw_show).or(extract_single_year(raw_show))
407
- year_end = extract_year_end(raw_show).or(extract_single_year(raw_show))
408
-
409
- name.bind do |n|
410
- year_start.bind do |ys|
411
- year_end.fmap do |ye|
412
- TvShow.new(title: n, start_year: ys, end_year: ye)
413
- end
414
- end
415
- end
416
- end
417
- ```
418
-
419
- </details>
420
-
421
- ---
422
-
423
- ## 7.5 代数的データ型(ADT)
424
-
425
- ADT は関数型プログラミングのドメインモデリングの基盤です。**直和型**(「A または B」)と**直積型**(「A かつ B」)の組み合わせで、ドメインの概念を型で正確に表現します。
426
-
427
- ### 直和型の例:YearsActive
428
-
429
- アーティストの活動期間は「活動中」か「活動終了」のどちらかです:
430
-
431
- ```plantuml
432
- @startuml
433
- !theme plain
434
-
435
- rectangle "YearsActive(直和型)" #LightBlue {
436
- card "StillActive(since: Int)" as sa #LightGreen
437
- card "ActiveBetween(start: Int, end: Int)" as ab #LightYellow
438
- }
439
-
440
- note bottom of sa : 現在も活動中
441
- note bottom of ab : 活動を終了
442
-
443
- @enduml
444
- ```
445
-
446
- ### 代表 3 言語の ADT 定義
447
-
448
- **Haskell**: data 型
449
-
450
- ```haskell
451
- data MusicGenre = HeavyMetal | Pop | HardRock | Grunge
452
- deriving (Show, Eq)
453
-
454
- data YearsActive
455
- = StillActive Int
456
- | ActiveBetween Int Int
457
- deriving (Show, Eq)
458
-
459
- data Artist = Artist
460
- { artistName :: String
461
- , artistGenre :: MusicGenre
462
- , artistOrigin :: Location
463
- , artistYearsActive :: YearsActive
464
- }
465
- ```
466
-
467
- **Rust**: enum
468
-
469
- ```rust
470
- #[derive(Debug, Clone, PartialEq)]
471
- pub enum MusicGenre {
472
- HeavyMetal,
473
- Pop,
474
- HardRock,
475
- Jazz,
476
- }
477
-
478
- #[derive(Debug, Clone, PartialEq)]
479
- pub enum YearsActive {
480
- StillActive { since: i32 },
481
- ActiveBetween { start: i32, end: i32 },
482
- }
483
-
484
- pub struct Artist {
485
- pub name: String,
486
- pub genre: MusicGenre,
487
- pub origin: Location,
488
- pub years_active: YearsActive,
489
- }
490
- ```
491
-
492
- **Scala**: enum(Scala 3)
493
-
494
- ```scala
495
- enum MusicGenre {
496
- case HeavyMetal, Pop, HardRock
497
- }
498
-
499
- enum YearsActive {
500
- case StillActive(since: Int)
501
- case ActiveBetween(start: Int, end: Int)
502
- }
503
-
504
- case class Artist(
505
- name: String,
506
- genre: MusicGenre,
507
- origin: Location,
508
- yearsActive: YearsActive
509
- )
510
- ```
511
-
512
- ### 全 11 言語の ADT 表現
513
-
514
- | 言語 | 直和型の構文 | 直積型の構文 | 網羅性チェック |
515
- |------|------------|------------|-------------|
516
- | **Haskell** | `data T = A \| B` | `data T = T { field :: Type }` | コンパイラ警告 |
517
- | **Rust** | `enum T { A, B }` | `struct T { field: Type }` | コンパイルエラー |
518
- | **F#** | `type T = A \| B` | `type T = { Field: Type }` | コンパイラ警告 |
519
- | **Scala** | `enum T { case A; case B }` | `case class T(field: Type)` | コンパイラ警告 |
520
- | **Java** | `sealed interface T` + `record` | `record T(Type field)` | コンパイルエラー(21+) |
521
- | **C#** | `abstract record` + 派生 record | `record T(Type Field)` | switch 式で警告 |
522
- | **TypeScript** | `type T = { _tag: 'A' } \| { _tag: 'B' }` | `interface T { field: Type }` | なし(型レベル) |
523
- | **Python** | `Enum` + `@dataclass` | `@dataclass(frozen=True)` | match(3.10+) |
524
- | **Clojure** | マップ + `:type` タグ | マップ | なし |
525
- | **Elixir** | タプル `{:tag, ...}` | `defstruct` | なし |
526
- | **Ruby** | モジュール + クラス | `Struct` | case when |
527
-
528
- <details>
529
- <summary>全 11 言語の ADT 定義</summary>
530
-
531
- **F#**(判別共用体):
532
- ```fsharp
533
- type MusicGenre = HeavyMetal | Pop | HardRock | Jazz
534
-
535
- type YearsActive =
536
- | StillActive of since: int
537
- | ActiveBetween of start: int * endYear: int
538
- ```
539
-
540
- **Java**(sealed interface + record):
541
- ```java
542
- public sealed interface YearsActive permits StillActive, ActiveBetween {}
543
- public record StillActive(int since) implements YearsActive {}
544
- public record ActiveBetween(int start, int end) implements YearsActive {}
545
- ```
546
-
547
- **C#**(abstract record):
548
- ```csharp
549
- public abstract record YearsActive;
550
- public record StillActive(int Since) : YearsActive;
551
- public record ActiveBetween(int Start, int EndYear) : YearsActive;
552
- ```
553
-
554
- **TypeScript**(discriminated union):
555
- ```typescript
556
- type YearsActive =
557
- | { readonly _tag: 'StillActive'; readonly since: number }
558
- | { readonly _tag: 'ActiveBetween'; readonly start: number; readonly end: number }
559
- ```
560
-
561
- **Clojure**(マップ + タグ):
562
- ```clojure
563
- (defn still-active [since]
564
- {:type :still-active :since since})
565
-
566
- (defn active-between [start end]
567
- {:type :active-between :start start :end end})
568
- ```
569
-
570
- **Elixir**(タプル):
571
- ```elixir
572
- # {:still_active, since}
573
- # {:active_between, start, end_year}
574
- ```
575
-
576
- **Python**(dataclass + Union):
577
- ```python
578
- @dataclass(frozen=True)
579
- class StillActive:
580
- since: int
581
-
582
- @dataclass(frozen=True)
583
- class ActiveBetween:
584
- start: int
585
- end: int
586
-
587
- YearsActive = StillActive | ActiveBetween
588
- ```
589
-
590
- **Ruby**(Module + Classes):
591
- ```ruby
592
- module YearsActive
593
- class StillActive
594
- attr_reader :since
595
- def initialize(since) = @since = since
596
- end
597
-
598
- class ActiveBetween
599
- attr_reader :start_year, :end_year
600
- def initialize(start_year, end_year)
601
- @start_year = start_year
602
- @end_year = end_year
603
- end
604
- end
605
- end
606
- ```
607
-
608
- </details>
609
-
610
- ---
611
-
612
- ## 7.6 パターンマッチ:ADT の安全な処理
613
-
614
- ADT の各ケースを処理するパターンマッチは、関数型プログラミングの中核です。アーティストが特定期間に活動していたかを判定する関数で比較します。
615
-
616
- ### 代表 3 言語の比較
617
-
618
- **Haskell**:
619
-
620
- ```haskell
621
- wasArtistActive :: Artist -> Int -> Int -> Bool
622
- wasArtistActive artist yearStart yearEnd =
623
- case artistYearsActive artist of
624
- StillActive since -> since <= yearEnd
625
- ActiveBetween start end_ -> start <= yearEnd && end_ >= yearStart
626
- ```
627
-
628
- **Rust**:
629
-
630
- ```rust
631
- pub fn was_artist_active(artist: &Artist, year_start: i32, year_end: i32) -> bool {
632
- match &artist.years_active {
633
- YearsActive::StillActive { since } => *since <= year_end,
634
- YearsActive::ActiveBetween { start, end } =>
635
- *start <= year_end && *end >= year_start,
636
- }
637
- }
638
- ```
639
-
640
- **Scala**:
641
-
642
- ```scala
643
- def wasArtistActive(artist: Artist, yearStart: Int, yearEnd: Int): Boolean =
644
- artist.yearsActive match {
645
- case StillActive(since) => since <= yearEnd
646
- case ActiveBetween(start, end) => start <= yearEnd && end >= yearStart
647
- }
648
- ```
649
-
650
- ### 網羅性チェックの比較
651
-
652
- | レベル | 言語 | 挙動 |
653
- |--------|------|------|
654
- | **コンパイルエラー** | Rust, Java (21+ sealed) | ケースが不足するとコンパイルが失敗する |
655
- | **コンパイラ警告** | Haskell, Scala, F# | 警告が出るが、コンパイルは通る |
656
- | **IDE 警告のみ** | C#, TypeScript | エディタが警告するが言語レベルでは強制しない |
657
- | **なし** | Clojure, Elixir, Python, Ruby | 動的型付けのため網羅性チェックなし |
658
-
659
- **発見**: Rust は `match` で全ケースを処理しないとコンパイルエラーになる唯一の言語です。これにより、ADT にケースを追加した際に、処理漏れを確実に検出できます。
660
-
661
- ---
662
-
663
- ## 7.7 Option と Either の変換
664
-
665
- Option と Either は相互に変換可能です。失敗理由を付加して Option → Either、理由を捨てて Either → Option に変換します。
666
-
667
- ### 代表的な変換パターン
668
-
669
- | 方向 | Scala | Haskell | Rust | F# |
670
- |------|-------|---------|------|----|
671
- | Option → Either | `opt.toRight("error")` | `maybeToEither "error" mb` | `opt.ok_or("error")` | `Option.toResult` |
672
- | Either → Option | `either.toOption` | `eitherToMaybe e` | `result.ok()` | `Result.toOption` |
673
-
674
- ```scala
675
- // Scala
676
- val opt: Option[Int] = Some(42)
677
- val either: Either[String, Int] = opt.toRight("Value not found")
678
- // Right(42)
679
-
680
- val back: Option[Int] = either.toOption
681
- // Some(42)
682
- ```
683
-
684
- ```rust
685
- // Rust
686
- let opt: Option<i32> = Some(42);
687
- let result: Result<i32, &str> = opt.ok_or("Value not found");
688
- // Ok(42)
689
-
690
- let back: Option<i32> = result.ok();
691
- // Some(42)
692
- ```
693
-
694
- ---
695
-
696
- ## 7.8 比較分析:3 つの発見
697
-
698
- ### 発見 1: Either/Result の命名は 3 系統に分かれる
699
-
700
- | 系統 | 成功 | 失敗 | 言語 |
701
- |------|------|------|------|
702
- | **Either 系** | `Right` | `Left` | Haskell, Scala, Java (Vavr), C# (LE), TypeScript (fp-ts) |
703
- | **Result 系** | `Ok` | `Err` / `Error` | Rust, F# |
704
- | **Success/Failure 系** | `Success` | `Failure` | Python (returns), Ruby (dry-monads) |
705
-
706
- Either 系は数学的な「左右」に由来し、Result 系は実用的な命名です。Elixir の `{:ok, value}` / `{:error, reason}` は Result 系のタプル表現です。
707
-
708
- ### 発見 2: ADT の表現力は言語の型システムに依存する
709
-
710
- ```plantuml
711
- @startuml
712
- !theme plain
713
- left to right direction
714
-
715
- rectangle "Level 1: ファーストクラス ADT" #LightGreen {
716
- card "Haskell (data)" as h
717
- card "Rust (enum)" as rs
718
- card "F# (判別共用体)" as fs
719
- }
720
-
721
- rectangle "Level 2: 型システムで近似" #LightBlue {
722
- card "Scala (enum)" as sc
723
- card "Java (sealed)" as jv
724
- card "C# (abstract record)" as cs
725
- card "TypeScript (discriminated union)" as ts
726
- }
727
-
728
- rectangle "Level 3: 慣習的 ADT" #LightYellow {
729
- card "Python (dataclass + Union)" as py
730
- card "Ruby (Module + Class)" as rb
731
- }
732
-
733
- rectangle "Level 4: データで表現" #LightCoral {
734
- card "Clojure (:type タグ)" as clj
735
- card "Elixir (タプル)" as ex
736
- }
737
-
738
- @enduml
739
- ```
740
-
741
- Haskell, Rust, F# はファーストクラスの ADT を持ち、コンパイラによる網羅性チェックが保証されます。TypeScript の discriminated union は `_tag` フィールドで近似しますが、言語レベルの保証はありません。
742
-
743
- ### 発見 3: Either の合成構文は Option と共通
744
-
745
- 前章の Option と本章の Either は、同じ合成構文(for / do / LINQ / `?`)で使えます。これは両者が同じ**モナドインターフェース**を共有しているからです:
746
-
747
- ```
748
- Option.flatMap: Option[A] → (A → Option[B]) → Option[B]
749
- Either.flatMap: Either[E,A] → (A → Either[E,B]) → Either[E,B]
750
- ```
751
-
752
- Scala の for 内包表記、Haskell の do 記法、Rust の `?` 演算子は、Option と Either の両方で同じように機能します。
753
-
754
- ---
755
-
756
- ## 7.9 言語固有の特徴
757
-
758
- ### Rust: カスタムエラー型と ? 演算子
759
-
760
- Rust では文字列ではなく専用の enum でエラーを表現するのが慣習です:
761
-
762
- ```rust
763
- #[derive(Debug, Clone, PartialEq)]
764
- pub enum ParseError {
765
- MissingName,
766
- MissingYear,
767
- InvalidYear(String),
768
- MissingBracket,
769
- }
770
-
771
- pub fn extract_name(raw_show: &str) -> Result<String, ParseError> {
772
- let bracket_open = raw_show.find('(').ok_or(ParseError::MissingBracket)?;
773
- if bracket_open > 0 {
774
- Ok(raw_show[..bracket_open].trim().to_string())
775
- } else {
776
- Err(ParseError::MissingName)
777
- }
778
- }
779
- ```
780
-
781
- エラー型を enum にすることで、パターンマッチでエラーの種類ごとに処理を分けられます。
782
-
783
- ### Elixir: {:ok, value} / {:error, reason} のタプルパターン
784
-
785
- Elixir のタプルパターンは Erlang/OTP の伝統を引き継ぎ、エコシステム全体で統一されています:
786
-
787
- ```elixir
788
- case File.read("config.json") do
789
- {:ok, content} -> Jason.decode(content)
790
- {:error, :enoent} -> {:error, "File not found"}
791
- {:error, reason} -> {:error, "Failed: #{reason}"}
792
- end
793
- ```
794
-
795
- ### Clojure: fnil によるデフォルト値関数
796
-
797
- Clojure の `fnil` は、nil が渡された場合にデフォルト値を使う関数を生成します:
798
-
799
- ```clojure
800
- (def safe-inc (fnil inc 0))
801
- (safe-inc nil) ; => 1
802
- (safe-inc 5) ; => 6
803
- ```
804
-
805
- ### Java: sealed interface(Java 17+)
806
-
807
- Java 17 の `sealed interface` は、実装クラスを限定した直和型を実現します:
808
-
809
- ```java
810
- public sealed interface YearsActive permits StillActive, ActiveBetween {}
811
- public record StillActive(int since) implements YearsActive {}
812
- public record ActiveBetween(int start, int end) implements YearsActive {}
813
- ```
814
-
815
- Java 21 のパターンマッチ switch と組み合わせると、Scala に近い ADT 操作が可能になります。
816
-
817
- ---
818
-
819
- ## 7.10 実践的な選択指針
820
-
821
- ### Either/Result の選択
822
-
823
- | 要件 | 推奨言語 | 理由 |
824
- |------|---------|------|
825
- | 最も簡潔なエラー伝播 | Rust | `?` 演算子 + カスタムエラー enum |
826
- | 可読性の高い合成 | Scala, C# | for 内包表記 / LINQ |
827
- | 完全な型安全性 | Haskell | Either モナド + do 記法 |
828
- | 既存 OOP 資産との共存 | Java + Vavr, C# + LE | ライブラリで段階導入 |
829
- | エコシステム統一 | Elixir | {:ok}/{:error} がエコシステム全体で統一 |
830
-
831
- ### ADT の選択
832
-
833
- | 要件 | 推奨言語 | 理由 |
834
- |------|---------|------|
835
- | 網羅性チェックの強制 | Rust | match の網羅性がコンパイルエラー |
836
- | 最も表現力の高い ADT | Haskell, F# | ファーストクラスの直和型 |
837
- | OOP チームでの導入 | Scala, Java, C# | sealed trait/interface でなじみやすい |
838
- | 型レベルの Union | TypeScript | discriminated union |
839
-
840
- ---
841
-
842
- ## 7.11 まとめ
843
-
844
- 本章では、11 言語での Either/Result と ADT の実装を比較し、以下を確認しました:
845
-
846
- **共通の原則**:
847
-
848
- - Either = Right(成功) | Left(失敗) は全言語で同じ構造
849
- - ADT = 直和型 + 直積型でドメインを正確にモデリング
850
- - パターンマッチによる各ケースの安全な処理
851
-
852
- **言語間の差異**:
853
-
854
- - 命名は 3 系統(Either 系 / Result 系 / Success/Failure 系)
855
- - ADT の表現力は 4 段階(ファーストクラス → 型で近似 → 慣習的 → データ表現)
856
- - 網羅性チェックは Rust が最も厳格(コンパイルエラー)
857
-
858
- **学び**:
859
-
860
- - Either は Option の「失敗に理由を持たせた」拡張
861
- - 合成構文(for / do / LINQ / `?`)は Option と Either で共通
862
- - ADT + パターンマッチは、不正な状態を型レベルで排除する強力なツール
863
-
864
- ---
865
-
866
- ### 各言語の詳細記事
867
-
868
- | 言語 | 記事リンク |
869
- |------|-----------|
870
- | Scala | [Part III: エラーハンドリング](../scala/part-3.md) |
871
- | Java | [Part III: エラーハンドリング](../java/part-3.md) |
872
- | F# | [Part III: エラーハンドリング](../fsharp/part-3.md) |
873
- | C# | [Part III: エラーハンドリング](../csharp/part-3.md) |
874
- | Haskell | [Part III: エラーハンドリング](../haskell/part-3.md) |
875
- | Clojure | [Part III: エラーハンドリング](../clojure/part-3.md) |
876
- | Elixir | [Part III: エラーハンドリング](../elixir/part-3.md) |
877
- | Rust | [Part III: エラーハンドリング](../rust/part-3.md) |
878
- | Python | [Part III: エラーハンドリング](../python/part-3.md) |
879
- | TypeScript | [Part III: エラーハンドリング](../typescript/part-3.md) |
880
- | Ruby | [Part III: エラーハンドリング](../ruby/part-3.md) |