@k2works/claude-code-booster 2.7.1 → 3.1.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 (527) hide show
  1. package/lib/assets/docs/article/functional-desgin-ppp/all/01-immutability-and-data-transformation.md +475 -0
  2. package/lib/assets/docs/article/functional-desgin-ppp/all/02-function-composition.md +519 -0
  3. package/lib/assets/docs/article/functional-desgin-ppp/all/03-polymorphism.md +537 -0
  4. package/lib/assets/docs/article/functional-desgin-ppp/all/04-data-validation.md +300 -0
  5. package/lib/assets/docs/article/functional-desgin-ppp/all/05-property-based-testing.md +320 -0
  6. package/lib/assets/docs/article/functional-desgin-ppp/all/06-tdd-and-functional.md +498 -0
  7. package/lib/assets/docs/article/functional-desgin-ppp/all/07-composite-pattern.md +298 -0
  8. package/lib/assets/docs/article/functional-desgin-ppp/all/08-decorator-pattern.md +291 -0
  9. package/lib/assets/docs/article/functional-desgin-ppp/all/09-adapter-pattern.md +336 -0
  10. package/lib/assets/docs/article/functional-desgin-ppp/all/10-strategy-pattern.md +303 -0
  11. package/lib/assets/docs/article/functional-desgin-ppp/all/11-command-pattern.md +286 -0
  12. package/lib/assets/docs/article/functional-desgin-ppp/all/12-visitor-pattern.md +322 -0
  13. package/lib/assets/docs/article/functional-desgin-ppp/all/13-abstract-factory-pattern.md +319 -0
  14. package/lib/assets/docs/article/functional-desgin-ppp/all/14-abstract-server-pattern.md +365 -0
  15. package/lib/assets/docs/article/functional-desgin-ppp/all/15-gossiping-bus-drivers.md +156 -0
  16. package/lib/assets/docs/article/functional-desgin-ppp/all/16-payroll-system.md +178 -0
  17. package/lib/assets/docs/article/functional-desgin-ppp/all/17-video-rental-system.md +312 -0
  18. package/lib/assets/docs/article/functional-desgin-ppp/all/18-concurrency-system.md +287 -0
  19. package/lib/assets/docs/article/functional-desgin-ppp/all/19-wa-tor-simulation.md +286 -0
  20. package/lib/assets/docs/article/functional-desgin-ppp/all/20-pattern-interactions.md +274 -0
  21. package/lib/assets/docs/article/functional-desgin-ppp/all/21-best-practices.md +294 -0
  22. package/lib/assets/docs/article/functional-desgin-ppp/all/22-oo-to-fp-migration.md +337 -0
  23. package/lib/assets/docs/article/functional-desgin-ppp/all/index.md +388 -0
  24. package/lib/assets/docs/article/functional-desgin-ppp/clojure/01-immutability-and-data-transformation.md +271 -0
  25. package/lib/assets/docs/article/functional-desgin-ppp/clojure/02-function-composition.md +380 -0
  26. package/lib/assets/docs/article/functional-desgin-ppp/clojure/03-polymorphism.md +384 -0
  27. package/lib/assets/docs/article/functional-desgin-ppp/clojure/04-clojure-spec.md +350 -0
  28. package/lib/assets/docs/article/functional-desgin-ppp/clojure/05-property-based-testing.md +352 -0
  29. package/lib/assets/docs/article/functional-desgin-ppp/clojure/06-tdd-in-functional.md +383 -0
  30. package/lib/assets/docs/article/functional-desgin-ppp/clojure/07-composite-pattern.md +529 -0
  31. package/lib/assets/docs/article/functional-desgin-ppp/clojure/08-decorator-pattern.md +395 -0
  32. package/lib/assets/docs/article/functional-desgin-ppp/clojure/09-adapter-pattern.md +399 -0
  33. package/lib/assets/docs/article/functional-desgin-ppp/clojure/10-strategy-pattern.md +485 -0
  34. package/lib/assets/docs/article/functional-desgin-ppp/clojure/11-command-pattern.md +566 -0
  35. package/lib/assets/docs/article/functional-desgin-ppp/clojure/12-visitor-pattern.md +567 -0
  36. package/lib/assets/docs/article/functional-desgin-ppp/clojure/13-abstract-factory-pattern.md +475 -0
  37. package/lib/assets/docs/article/functional-desgin-ppp/clojure/14-abstract-server-pattern.md +462 -0
  38. package/lib/assets/docs/article/functional-desgin-ppp/clojure/15-gossiping-bus-drivers.md +323 -0
  39. package/lib/assets/docs/article/functional-desgin-ppp/clojure/16-payroll-system.md +401 -0
  40. package/lib/assets/docs/article/functional-desgin-ppp/clojure/17-video-rental-system.md +450 -0
  41. package/lib/assets/docs/article/functional-desgin-ppp/clojure/18-concurrency-system.md +475 -0
  42. package/lib/assets/docs/article/functional-desgin-ppp/clojure/19-wator-simulation.md +739 -0
  43. package/lib/assets/docs/article/functional-desgin-ppp/clojure/20-pattern-interactions.md +562 -0
  44. package/lib/assets/docs/article/functional-desgin-ppp/clojure/21-best-practices.md +506 -0
  45. package/lib/assets/docs/article/functional-desgin-ppp/clojure/22-oo-to-fp-migration.md +526 -0
  46. package/lib/assets/docs/article/functional-desgin-ppp/clojure/index.md +197 -0
  47. package/lib/assets/docs/article/functional-desgin-ppp/elixir/01-immutability-and-data-transformation.md +381 -0
  48. package/lib/assets/docs/article/functional-desgin-ppp/elixir/02-function-composition.md +374 -0
  49. package/lib/assets/docs/article/functional-desgin-ppp/elixir/03-polymorphism.md +375 -0
  50. package/lib/assets/docs/article/functional-desgin-ppp/elixir/04-data-validation.md +195 -0
  51. package/lib/assets/docs/article/functional-desgin-ppp/elixir/05-property-based-testing.md +268 -0
  52. package/lib/assets/docs/article/functional-desgin-ppp/elixir/06-tdd-and-fp.md +294 -0
  53. package/lib/assets/docs/article/functional-desgin-ppp/elixir/07-effects-and-pure-functions.md +164 -0
  54. package/lib/assets/docs/article/functional-desgin-ppp/elixir/08-error-handling-strategies.md +168 -0
  55. package/lib/assets/docs/article/functional-desgin-ppp/elixir/09-io-and-external-systems.md +254 -0
  56. package/lib/assets/docs/article/functional-desgin-ppp/elixir/10-concurrency-patterns.md +269 -0
  57. package/lib/assets/docs/article/functional-desgin-ppp/elixir/11-command-pattern.md +148 -0
  58. package/lib/assets/docs/article/functional-desgin-ppp/elixir/12-visitor-pattern.md +176 -0
  59. package/lib/assets/docs/article/functional-desgin-ppp/elixir/13-abstract-factory-pattern.md +604 -0
  60. package/lib/assets/docs/article/functional-desgin-ppp/elixir/14-abstract-server-pattern.md +729 -0
  61. package/lib/assets/docs/article/functional-desgin-ppp/elixir/15-gossiping-bus-drivers.md +291 -0
  62. package/lib/assets/docs/article/functional-desgin-ppp/elixir/16-payroll-system.md +420 -0
  63. package/lib/assets/docs/article/functional-desgin-ppp/elixir/17-video-rental-system.md +319 -0
  64. package/lib/assets/docs/article/functional-desgin-ppp/elixir/18-concurrency-system.md +466 -0
  65. package/lib/assets/docs/article/functional-desgin-ppp/elixir/19-wator-simulation.md +523 -0
  66. package/lib/assets/docs/article/functional-desgin-ppp/elixir/20-pattern-interactions.md +287 -0
  67. package/lib/assets/docs/article/functional-desgin-ppp/elixir/21-best-practices.md +340 -0
  68. package/lib/assets/docs/article/functional-desgin-ppp/elixir/22-oo-to-fp-migration.md +395 -0
  69. package/lib/assets/docs/article/functional-desgin-ppp/elixir/index.md +204 -0
  70. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/01-immutability-and-data-transformation.md +382 -0
  71. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/02-function-composition.md +452 -0
  72. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/03-polymorphism.md +495 -0
  73. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/04-data-validation.md +416 -0
  74. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/05-property-based-testing.md +382 -0
  75. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/06-tdd-functional.md +687 -0
  76. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/07-composite-pattern.md +442 -0
  77. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/08-decorator-pattern.md +479 -0
  78. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/09-adapter-pattern.md +479 -0
  79. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/10-strategy-pattern.md +427 -0
  80. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/11-command-pattern.md +428 -0
  81. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/12-visitor-pattern.md +339 -0
  82. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/13-abstract-factory-pattern.md +309 -0
  83. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/14-abstract-server-pattern.md +596 -0
  84. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/15-gossiping-bus-drivers.md +353 -0
  85. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/16-payroll-system.md +350 -0
  86. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/17-video-rental-system.md +412 -0
  87. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/18-concurrency-system.md +367 -0
  88. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/19-wator-simulation.md +401 -0
  89. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/20-pattern-interactions.md +291 -0
  90. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/21-best-practices.md +320 -0
  91. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/22-oo-to-fp-migration.md +322 -0
  92. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/index.md +230 -0
  93. package/lib/assets/docs/article/functional-desgin-ppp/haskell/01-immutability-and-data-transformation.md +298 -0
  94. package/lib/assets/docs/article/functional-desgin-ppp/haskell/02-function-composition.md +304 -0
  95. package/lib/assets/docs/article/functional-desgin-ppp/haskell/03-polymorphism.md +362 -0
  96. package/lib/assets/docs/article/functional-desgin-ppp/haskell/04-data-validation.md +257 -0
  97. package/lib/assets/docs/article/functional-desgin-ppp/haskell/05-property-based-testing.md +254 -0
  98. package/lib/assets/docs/article/functional-desgin-ppp/haskell/06-tdd-functional.md +283 -0
  99. package/lib/assets/docs/article/functional-desgin-ppp/haskell/07-composite-pattern.md +395 -0
  100. package/lib/assets/docs/article/functional-desgin-ppp/haskell/08-decorator-pattern.md +319 -0
  101. package/lib/assets/docs/article/functional-desgin-ppp/haskell/09-adapter-pattern.md +382 -0
  102. package/lib/assets/docs/article/functional-desgin-ppp/haskell/10-strategy-pattern.md +287 -0
  103. package/lib/assets/docs/article/functional-desgin-ppp/haskell/11-command-pattern.md +303 -0
  104. package/lib/assets/docs/article/functional-desgin-ppp/haskell/12-visitor-pattern.md +326 -0
  105. package/lib/assets/docs/article/functional-desgin-ppp/haskell/13-abstract-factory-pattern.md +332 -0
  106. package/lib/assets/docs/article/functional-desgin-ppp/haskell/14-abstract-server-pattern.md +379 -0
  107. package/lib/assets/docs/article/functional-desgin-ppp/haskell/15-gossiping-bus-drivers.md +175 -0
  108. package/lib/assets/docs/article/functional-desgin-ppp/haskell/16-payroll-system.md +219 -0
  109. package/lib/assets/docs/article/functional-desgin-ppp/haskell/17-video-rental-system.md +244 -0
  110. package/lib/assets/docs/article/functional-desgin-ppp/haskell/18-concurrency-system.md +363 -0
  111. package/lib/assets/docs/article/functional-desgin-ppp/haskell/19-wator-simulation.md +438 -0
  112. package/lib/assets/docs/article/functional-desgin-ppp/haskell/20-pattern-interactions.md +323 -0
  113. package/lib/assets/docs/article/functional-desgin-ppp/haskell/21-best-practices.md +403 -0
  114. package/lib/assets/docs/article/functional-desgin-ppp/haskell/22-oo-to-fp-migration.md +469 -0
  115. package/lib/assets/docs/article/functional-desgin-ppp/haskell/index.md +174 -0
  116. package/lib/assets/docs/article/functional-desgin-ppp/index.md +90 -0
  117. package/lib/assets/docs/article/functional-desgin-ppp/rust/01-immutability-and-data-transformation.md +448 -0
  118. package/lib/assets/docs/article/functional-desgin-ppp/rust/02-function-composition.md +463 -0
  119. package/lib/assets/docs/article/functional-desgin-ppp/rust/03-polymorphism.md +425 -0
  120. package/lib/assets/docs/article/functional-desgin-ppp/rust/04-data-validation.md +273 -0
  121. package/lib/assets/docs/article/functional-desgin-ppp/rust/05-property-based-testing.md +247 -0
  122. package/lib/assets/docs/article/functional-desgin-ppp/rust/06-tdd-and-functional.md +841 -0
  123. package/lib/assets/docs/article/functional-desgin-ppp/rust/07-composite-pattern.md +384 -0
  124. package/lib/assets/docs/article/functional-desgin-ppp/rust/08-decorator-pattern.md +383 -0
  125. package/lib/assets/docs/article/functional-desgin-ppp/rust/09-adapter-pattern.md +339 -0
  126. package/lib/assets/docs/article/functional-desgin-ppp/rust/10-strategy-pattern.md +331 -0
  127. package/lib/assets/docs/article/functional-desgin-ppp/rust/11-command-pattern.md +356 -0
  128. package/lib/assets/docs/article/functional-desgin-ppp/rust/12-visitor-pattern.md +379 -0
  129. package/lib/assets/docs/article/functional-desgin-ppp/rust/13-abstract-factory-pattern.md +361 -0
  130. package/lib/assets/docs/article/functional-desgin-ppp/rust/14-abstract-server-pattern.md +392 -0
  131. package/lib/assets/docs/article/functional-desgin-ppp/rust/15-gossiping-bus-drivers.md +300 -0
  132. package/lib/assets/docs/article/functional-desgin-ppp/rust/16-payroll-system.md +297 -0
  133. package/lib/assets/docs/article/functional-desgin-ppp/rust/17-video-rental-system.md +304 -0
  134. package/lib/assets/docs/article/functional-desgin-ppp/rust/18-concurrency-system.md +315 -0
  135. package/lib/assets/docs/article/functional-desgin-ppp/rust/19-wator-simulation.md +311 -0
  136. package/lib/assets/docs/article/functional-desgin-ppp/rust/20-pattern-interactions.md +304 -0
  137. package/lib/assets/docs/article/functional-desgin-ppp/rust/21-best-practices.md +336 -0
  138. package/lib/assets/docs/article/functional-desgin-ppp/rust/22-oo-to-fp-migration.md +349 -0
  139. package/lib/assets/docs/article/functional-desgin-ppp/rust/index.md +199 -0
  140. package/lib/assets/docs/article/functional-desgin-ppp/scala/01-immutability-and-data-transformation.md +326 -0
  141. package/lib/assets/docs/article/functional-desgin-ppp/scala/02-function-composition.md +348 -0
  142. package/lib/assets/docs/article/functional-desgin-ppp/scala/03-polymorphism.md +357 -0
  143. package/lib/assets/docs/article/functional-desgin-ppp/scala/04-data-validation.md +364 -0
  144. package/lib/assets/docs/article/functional-desgin-ppp/scala/05-property-based-testing.md +515 -0
  145. package/lib/assets/docs/article/functional-desgin-ppp/scala/06-tdd-functional.md +557 -0
  146. package/lib/assets/docs/article/functional-desgin-ppp/scala/07-composite-pattern.md +363 -0
  147. package/lib/assets/docs/article/functional-desgin-ppp/scala/08-decorator-pattern.md +327 -0
  148. package/lib/assets/docs/article/functional-desgin-ppp/scala/09-adapter-pattern.md +517 -0
  149. package/lib/assets/docs/article/functional-desgin-ppp/scala/10-strategy-pattern.md +441 -0
  150. package/lib/assets/docs/article/functional-desgin-ppp/scala/11-command-pattern.md +407 -0
  151. package/lib/assets/docs/article/functional-desgin-ppp/scala/12-visitor-pattern.md +379 -0
  152. package/lib/assets/docs/article/functional-desgin-ppp/scala/13-abstract-factory-pattern.md +398 -0
  153. package/lib/assets/docs/article/functional-desgin-ppp/scala/14-abstract-server-pattern.md +476 -0
  154. package/lib/assets/docs/article/functional-desgin-ppp/scala/15-gossiping-bus-drivers.md +389 -0
  155. package/lib/assets/docs/article/functional-desgin-ppp/scala/16-payroll-system.md +342 -0
  156. package/lib/assets/docs/article/functional-desgin-ppp/scala/17-video-rental-system.md +324 -0
  157. package/lib/assets/docs/article/functional-desgin-ppp/scala/18-concurrency-system.md +730 -0
  158. package/lib/assets/docs/article/functional-desgin-ppp/scala/19-wator-simulation.md +624 -0
  159. package/lib/assets/docs/article/functional-desgin-ppp/scala/20-pattern-interactions.md +512 -0
  160. package/lib/assets/docs/article/functional-desgin-ppp/scala/21-best-practices.md +427 -0
  161. package/lib/assets/docs/article/functional-desgin-ppp/scala/22-oo-to-fp-migration.md +682 -0
  162. package/lib/assets/docs/article/functional-desgin-ppp/scala/index.md +199 -0
  163. package/lib/assets/docs/article/getting-start-tdd/clojure/01-todo-list-and-first-test.md +166 -0
  164. package/lib/assets/docs/article/getting-start-tdd/clojure/02-fake-it-and-triangulation.md +162 -0
  165. package/lib/assets/docs/article/getting-start-tdd/clojure/03-obvious-implementation-and-refactoring.md +135 -0
  166. package/lib/assets/docs/article/getting-start-tdd/clojure/04-version-control-and-conventional-commits.md +88 -0
  167. package/lib/assets/docs/article/getting-start-tdd/clojure/05-package-management-and-static-analysis.md +299 -0
  168. package/lib/assets/docs/article/getting-start-tdd/clojure/06-task-runner-and-ci-cd.md +241 -0
  169. package/lib/assets/docs/article/getting-start-tdd/clojure/07-protocols-and-records.md +131 -0
  170. package/lib/assets/docs/article/getting-start-tdd/clojure/08-multimethods-and-design-patterns.md +130 -0
  171. package/lib/assets/docs/article/getting-start-tdd/clojure/09-namespaces-and-module-design.md +127 -0
  172. package/lib/assets/docs/article/getting-start-tdd/clojure/10-higher-order-functions-and-composition.md +114 -0
  173. package/lib/assets/docs/article/getting-start-tdd/clojure/11-persistent-data-and-pipeline.md +138 -0
  174. package/lib/assets/docs/article/getting-start-tdd/clojure/12-error-handling-and-spec.md +161 -0
  175. package/lib/assets/docs/article/getting-start-tdd/clojure/index.md +65 -0
  176. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter01.md +232 -0
  177. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter02.md +244 -0
  178. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter03.md +202 -0
  179. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter04.md +92 -0
  180. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter05.md +256 -0
  181. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter06.md +195 -0
  182. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter07.md +214 -0
  183. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter08.md +249 -0
  184. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter09.md +174 -0
  185. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter10.md +166 -0
  186. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter11.md +192 -0
  187. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter12.md +211 -0
  188. package/lib/assets/docs/article/getting-start-tdd/csharp/index.md +83 -0
  189. package/lib/assets/docs/article/getting-start-tdd/elixir/01-todo-list-and-first-test.md +87 -0
  190. package/lib/assets/docs/article/getting-start-tdd/elixir/02-fake-it-and-triangulation.md +95 -0
  191. package/lib/assets/docs/article/getting-start-tdd/elixir/03-obvious-implementation-and-refactoring.md +109 -0
  192. package/lib/assets/docs/article/getting-start-tdd/elixir/04-version-control-and-conventional-commits.md +96 -0
  193. package/lib/assets/docs/article/getting-start-tdd/elixir/05-package-management-and-static-analysis.md +88 -0
  194. package/lib/assets/docs/article/getting-start-tdd/elixir/06-task-runner-and-ci-cd.md +71 -0
  195. package/lib/assets/docs/article/getting-start-tdd/elixir/07-structs-and-protocols.md +110 -0
  196. package/lib/assets/docs/article/getting-start-tdd/elixir/08-pattern-matching-and-guards.md +108 -0
  197. package/lib/assets/docs/article/getting-start-tdd/elixir/09-module-design-and-behaviours.md +104 -0
  198. package/lib/assets/docs/article/getting-start-tdd/elixir/10-higher-order-functions-and-pipeline.md +178 -0
  199. package/lib/assets/docs/article/getting-start-tdd/elixir/11-stream-and-lazy-evaluation.md +142 -0
  200. package/lib/assets/docs/article/getting-start-tdd/elixir/12-error-handling-and-with.md +145 -0
  201. package/lib/assets/docs/article/getting-start-tdd/elixir/index.md +35 -0
  202. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter01.md +202 -0
  203. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter02.md +246 -0
  204. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter03.md +218 -0
  205. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter04.md +179 -0
  206. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter05.md +267 -0
  207. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter06.md +190 -0
  208. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter07.md +161 -0
  209. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter08.md +175 -0
  210. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter09.md +222 -0
  211. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter10.md +189 -0
  212. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter11.md +212 -0
  213. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter12.md +215 -0
  214. package/lib/assets/docs/article/getting-start-tdd/fsharp/index.md +71 -0
  215. package/lib/assets/docs/article/getting-start-tdd/go/01-todo-list-and-first-test.md +213 -0
  216. package/lib/assets/docs/article/getting-start-tdd/go/02-fake-it-and-triangulation.md +302 -0
  217. package/lib/assets/docs/article/getting-start-tdd/go/03-obvious-implementation-and-refactoring.md +339 -0
  218. package/lib/assets/docs/article/getting-start-tdd/go/04-version-control-and-conventional-commits.md +112 -0
  219. package/lib/assets/docs/article/getting-start-tdd/go/05-package-management-and-static-analysis.md +272 -0
  220. package/lib/assets/docs/article/getting-start-tdd/go/06-task-runner-and-ci-cd.md +233 -0
  221. package/lib/assets/docs/article/getting-start-tdd/go/07-encapsulation-and-polymorphism.md +394 -0
  222. package/lib/assets/docs/article/getting-start-tdd/go/08-design-patterns.md +422 -0
  223. package/lib/assets/docs/article/getting-start-tdd/go/09-solid-principles-and-module-design.md +400 -0
  224. package/lib/assets/docs/article/getting-start-tdd/go/10-higher-order-functions-and-composition.md +226 -0
  225. package/lib/assets/docs/article/getting-start-tdd/go/11-immutable-data-and-pipeline.md +296 -0
  226. package/lib/assets/docs/article/getting-start-tdd/go/12-error-handling-and-type-safety.md +411 -0
  227. package/lib/assets/docs/article/getting-start-tdd/go/index.md +83 -0
  228. package/lib/assets/docs/article/getting-start-tdd/haskell/01-todo-list-and-first-test.md +279 -0
  229. package/lib/assets/docs/article/getting-start-tdd/haskell/02-fake-it-and-triangulation.md +337 -0
  230. package/lib/assets/docs/article/getting-start-tdd/haskell/03-obvious-implementation-and-refactoring.md +257 -0
  231. package/lib/assets/docs/article/getting-start-tdd/haskell/04-version-control-and-conventional-commits.md +182 -0
  232. package/lib/assets/docs/article/getting-start-tdd/haskell/05-package-management-and-static-analysis.md +313 -0
  233. package/lib/assets/docs/article/getting-start-tdd/haskell/06-task-runner-and-ci-cd.md +309 -0
  234. package/lib/assets/docs/article/getting-start-tdd/haskell/07-algebraic-data-types-and-type-classes.md +412 -0
  235. package/lib/assets/docs/article/getting-start-tdd/haskell/08-pattern-matching-and-guards.md +390 -0
  236. package/lib/assets/docs/article/getting-start-tdd/haskell/09-module-design-and-smart-constructors.md +461 -0
  237. package/lib/assets/docs/article/getting-start-tdd/haskell/10-higher-order-functions-and-currying.md +434 -0
  238. package/lib/assets/docs/article/getting-start-tdd/haskell/11-function-composition-and-point-free.md +392 -0
  239. package/lib/assets/docs/article/getting-start-tdd/haskell/12-monad-and-error-handling.md +631 -0
  240. package/lib/assets/docs/article/getting-start-tdd/haskell/index.md +49 -0
  241. package/lib/assets/docs/article/getting-start-tdd/index.md +93 -0
  242. package/lib/assets/docs/article/getting-start-tdd/integration/01-language-overview.md +375 -0
  243. package/lib/assets/docs/article/getting-start-tdd/integration/02-test-framework-comparison.md +349 -0
  244. package/lib/assets/docs/article/getting-start-tdd/integration/03-tdd-pattern-comparison.md +445 -0
  245. package/lib/assets/docs/article/getting-start-tdd/integration/04-type-system-comparison.md +405 -0
  246. package/lib/assets/docs/article/getting-start-tdd/integration/05-dev-environment-comparison.md +330 -0
  247. package/lib/assets/docs/article/getting-start-tdd/integration/06-learning-roadmap.md +274 -0
  248. package/lib/assets/docs/article/getting-start-tdd/integration/index.md +69 -0
  249. package/lib/assets/docs/article/getting-start-tdd/java/01-todo-list-and-first-test.md +234 -0
  250. package/lib/assets/docs/article/getting-start-tdd/java/02-fake-it-and-triangulation.md +261 -0
  251. package/lib/assets/docs/article/getting-start-tdd/java/03-obvious-implementation-and-refactoring.md +185 -0
  252. package/lib/assets/docs/article/getting-start-tdd/java/04-version-control-and-conventional-commits.md +115 -0
  253. package/lib/assets/docs/article/getting-start-tdd/java/05-package-management-and-static-analysis.md +382 -0
  254. package/lib/assets/docs/article/getting-start-tdd/java/06-task-runner-and-ci-cd.md +272 -0
  255. package/lib/assets/docs/article/getting-start-tdd/java/07-encapsulation-and-polymorphism.md +626 -0
  256. package/lib/assets/docs/article/getting-start-tdd/java/08-design-patterns.md +393 -0
  257. package/lib/assets/docs/article/getting-start-tdd/java/09-solid-principles-and-module-design.md +310 -0
  258. package/lib/assets/docs/article/getting-start-tdd/java/10-higher-order-functions-and-composition.md +188 -0
  259. package/lib/assets/docs/article/getting-start-tdd/java/11-immutable-data-and-pipeline.md +167 -0
  260. package/lib/assets/docs/article/getting-start-tdd/java/12-error-handling-and-type-safety.md +205 -0
  261. package/lib/assets/docs/article/getting-start-tdd/java/index.md +61 -0
  262. package/lib/assets/docs/article/getting-start-tdd/node/01-todo-list-and-first-test.md +244 -0
  263. package/lib/assets/docs/article/getting-start-tdd/node/02-fake-it-and-triangulation.md +262 -0
  264. package/lib/assets/docs/article/getting-start-tdd/node/03-obvious-implementation-and-refactoring.md +169 -0
  265. package/lib/assets/docs/article/getting-start-tdd/node/04-version-control-and-conventional-commits.md +112 -0
  266. package/lib/assets/docs/article/getting-start-tdd/node/05-package-management-and-static-analysis.md +314 -0
  267. package/lib/assets/docs/article/getting-start-tdd/node/06-task-runner-and-ci-cd.md +235 -0
  268. package/lib/assets/docs/article/getting-start-tdd/node/07-encapsulation-and-polymorphism.md +327 -0
  269. package/lib/assets/docs/article/getting-start-tdd/node/08-design-patterns.md +322 -0
  270. package/lib/assets/docs/article/getting-start-tdd/node/09-solid-principles-and-module-design.md +285 -0
  271. package/lib/assets/docs/article/getting-start-tdd/node/10-higher-order-functions-and-composition.md +199 -0
  272. package/lib/assets/docs/article/getting-start-tdd/node/11-immutable-data-and-pipeline.md +207 -0
  273. package/lib/assets/docs/article/getting-start-tdd/node/12-error-handling-and-type-safety.md +295 -0
  274. package/lib/assets/docs/article/getting-start-tdd/node/index.md +56 -0
  275. package/lib/assets/docs/article/getting-start-tdd/php/01-todo-list-and-first-test.md +259 -0
  276. package/lib/assets/docs/article/getting-start-tdd/php/02-fake-it-and-triangulation.md +200 -0
  277. package/lib/assets/docs/article/getting-start-tdd/php/03-obvious-implementation-and-refactoring.md +248 -0
  278. package/lib/assets/docs/article/getting-start-tdd/php/04-version-control-and-conventional-commits.md +141 -0
  279. package/lib/assets/docs/article/getting-start-tdd/php/05-package-management-and-static-analysis.md +410 -0
  280. package/lib/assets/docs/article/getting-start-tdd/php/06-task-runner-and-ci-cd.md +321 -0
  281. package/lib/assets/docs/article/getting-start-tdd/php/07-encapsulation-and-polymorphism.md +372 -0
  282. package/lib/assets/docs/article/getting-start-tdd/php/08-design-patterns.md +453 -0
  283. package/lib/assets/docs/article/getting-start-tdd/php/09-solid-principles-and-module-design.md +460 -0
  284. package/lib/assets/docs/article/getting-start-tdd/php/10-higher-order-functions-and-composition.md +182 -0
  285. package/lib/assets/docs/article/getting-start-tdd/php/11-immutable-data-and-pipeline.md +266 -0
  286. package/lib/assets/docs/article/getting-start-tdd/php/12-error-handling-and-type-safety.md +308 -0
  287. package/lib/assets/docs/article/getting-start-tdd/php/index.md +84 -0
  288. package/lib/assets/docs/article/getting-start-tdd/python/01-todo-list-and-first-test.md +201 -0
  289. package/lib/assets/docs/article/getting-start-tdd/python/02-fake-it-and-triangulation.md +247 -0
  290. package/lib/assets/docs/article/getting-start-tdd/python/03-obvious-implementation-and-refactoring.md +199 -0
  291. package/lib/assets/docs/article/getting-start-tdd/python/04-version-control-and-conventional-commits.md +87 -0
  292. package/lib/assets/docs/article/getting-start-tdd/python/05-package-management-and-static-analysis.md +274 -0
  293. package/lib/assets/docs/article/getting-start-tdd/python/06-task-runner-and-ci-cd.md +190 -0
  294. package/lib/assets/docs/article/getting-start-tdd/python/07-encapsulation-and-polymorphism.md +208 -0
  295. package/lib/assets/docs/article/getting-start-tdd/python/08-design-patterns.md +172 -0
  296. package/lib/assets/docs/article/getting-start-tdd/python/09-solid-principles-and-module-design.md +130 -0
  297. package/lib/assets/docs/article/getting-start-tdd/python/10-higher-order-functions-and-composition.md +122 -0
  298. package/lib/assets/docs/article/getting-start-tdd/python/11-immutable-data-and-pipeline.md +116 -0
  299. package/lib/assets/docs/article/getting-start-tdd/python/12-error-handling-and-type-safety.md +126 -0
  300. package/lib/assets/docs/article/getting-start-tdd/python/index.md +55 -0
  301. package/lib/assets/docs/article/getting-start-tdd/ruby/01-todo-list-and-first-test.md +231 -0
  302. package/lib/assets/docs/article/getting-start-tdd/ruby/02-fake-it-and-triangulation.md +238 -0
  303. package/lib/assets/docs/article/getting-start-tdd/ruby/03-obvious-implementation-and-refactoring.md +228 -0
  304. package/lib/assets/docs/article/getting-start-tdd/ruby/04-version-control-and-conventional-commits.md +112 -0
  305. package/lib/assets/docs/article/getting-start-tdd/ruby/05-package-management-and-static-analysis.md +287 -0
  306. package/lib/assets/docs/article/getting-start-tdd/ruby/06-task-runner-and-ci-cd.md +248 -0
  307. package/lib/assets/docs/article/getting-start-tdd/ruby/07-encapsulation-and-polymorphism.md +279 -0
  308. package/lib/assets/docs/article/getting-start-tdd/ruby/08-design-patterns.md +329 -0
  309. package/lib/assets/docs/article/getting-start-tdd/ruby/09-solid-principles-and-module-design.md +196 -0
  310. package/lib/assets/docs/article/getting-start-tdd/ruby/10-higher-order-functions-and-composition.md +175 -0
  311. package/lib/assets/docs/article/getting-start-tdd/ruby/11-immutable-data-and-pipeline.md +233 -0
  312. package/lib/assets/docs/article/getting-start-tdd/ruby/12-error-handling-and-type-safety.md +398 -0
  313. package/lib/assets/docs/article/getting-start-tdd/ruby/index.md +83 -0
  314. package/lib/assets/docs/article/getting-start-tdd/rust/01-todo-list-and-first-test.md +211 -0
  315. package/lib/assets/docs/article/getting-start-tdd/rust/02-fake-it-and-triangulation.md +264 -0
  316. package/lib/assets/docs/article/getting-start-tdd/rust/03-obvious-implementation-and-refactoring.md +233 -0
  317. package/lib/assets/docs/article/getting-start-tdd/rust/04-version-control-and-conventional-commits.md +92 -0
  318. package/lib/assets/docs/article/getting-start-tdd/rust/05-package-management-and-static-analysis.md +212 -0
  319. package/lib/assets/docs/article/getting-start-tdd/rust/06-task-runner-and-ci-cd.md +164 -0
  320. package/lib/assets/docs/article/getting-start-tdd/rust/07-encapsulation-and-polymorphism.md +142 -0
  321. package/lib/assets/docs/article/getting-start-tdd/rust/08-design-patterns.md +145 -0
  322. package/lib/assets/docs/article/getting-start-tdd/rust/09-solid-principles-and-module-design.md +110 -0
  323. package/lib/assets/docs/article/getting-start-tdd/rust/10-higher-order-functions-and-composition.md +94 -0
  324. package/lib/assets/docs/article/getting-start-tdd/rust/11-immutable-data-and-pipeline.md +105 -0
  325. package/lib/assets/docs/article/getting-start-tdd/rust/12-error-handling-and-type-safety.md +112 -0
  326. package/lib/assets/docs/article/getting-start-tdd/rust/index.md +83 -0
  327. package/lib/assets/docs/article/getting-start-tdd/scala/01-todo-list-and-first-test.md +111 -0
  328. package/lib/assets/docs/article/getting-start-tdd/scala/02-fake-it-and-triangulation.md +107 -0
  329. package/lib/assets/docs/article/getting-start-tdd/scala/03-obvious-implementation-and-refactoring.md +99 -0
  330. package/lib/assets/docs/article/getting-start-tdd/scala/04-version-control-and-conventional-commits.md +123 -0
  331. package/lib/assets/docs/article/getting-start-tdd/scala/05-package-management-and-static-analysis.md +196 -0
  332. package/lib/assets/docs/article/getting-start-tdd/scala/06-task-runner-and-ci-cd.md +186 -0
  333. package/lib/assets/docs/article/getting-start-tdd/scala/07-case-classes-and-traits.md +139 -0
  334. package/lib/assets/docs/article/getting-start-tdd/scala/08-pattern-matching-and-sealed-traits.md +106 -0
  335. package/lib/assets/docs/article/getting-start-tdd/scala/09-packages-and-module-design.md +75 -0
  336. package/lib/assets/docs/article/getting-start-tdd/scala/10-higher-order-functions-and-composition.md +104 -0
  337. package/lib/assets/docs/article/getting-start-tdd/scala/11-collections-and-lazy-evaluation.md +94 -0
  338. package/lib/assets/docs/article/getting-start-tdd/scala/12-error-handling-and-type-safety.md +92 -0
  339. package/lib/assets/docs/article/getting-start-tdd/scala/index.md +65 -0
  340. package/lib/assets/docs/article/grokking-concurrency/all/index.md +404 -0
  341. package/lib/assets/docs/article/grokking-concurrency/all/part-1-ch02-sequential.md +554 -0
  342. package/lib/assets/docs/article/grokking-concurrency/all/part-2-ch04-05-threads.md +469 -0
  343. package/lib/assets/docs/article/grokking-concurrency/all/part-3-ch06-multitasking.md +520 -0
  344. package/lib/assets/docs/article/grokking-concurrency/all/part-4-ch07-parallel-patterns.md +420 -0
  345. package/lib/assets/docs/article/grokking-concurrency/all/part-5-ch08-09-synchronization.md +510 -0
  346. package/lib/assets/docs/article/grokking-concurrency/all/part-6-ch10-11-nonblocking-io.md +435 -0
  347. package/lib/assets/docs/article/grokking-concurrency/all/part-7-ch12-async.md +465 -0
  348. package/lib/assets/docs/article/grokking-concurrency/all/part-8-ch13-mapreduce.md +377 -0
  349. package/lib/assets/docs/article/grokking-concurrency/clojure/index.md +116 -0
  350. package/lib/assets/docs/article/grokking-concurrency/clojure/part-1.md +108 -0
  351. package/lib/assets/docs/article/grokking-concurrency/clojure/part-2.md +101 -0
  352. package/lib/assets/docs/article/grokking-concurrency/clojure/part-3.md +122 -0
  353. package/lib/assets/docs/article/grokking-concurrency/clojure/part-4.md +123 -0
  354. package/lib/assets/docs/article/grokking-concurrency/clojure/part-5.md +118 -0
  355. package/lib/assets/docs/article/grokking-concurrency/clojure/part-6.md +89 -0
  356. package/lib/assets/docs/article/grokking-concurrency/clojure/part-7.md +100 -0
  357. package/lib/assets/docs/article/grokking-concurrency/clojure/part-8.md +120 -0
  358. package/lib/assets/docs/article/grokking-concurrency/csharp/index.md +101 -0
  359. package/lib/assets/docs/article/grokking-concurrency/csharp/part-1.md +97 -0
  360. package/lib/assets/docs/article/grokking-concurrency/csharp/part-2.md +123 -0
  361. package/lib/assets/docs/article/grokking-concurrency/csharp/part-3.md +101 -0
  362. package/lib/assets/docs/article/grokking-concurrency/csharp/part-4.md +112 -0
  363. package/lib/assets/docs/article/grokking-concurrency/csharp/part-5.md +99 -0
  364. package/lib/assets/docs/article/grokking-concurrency/csharp/part-6.md +61 -0
  365. package/lib/assets/docs/article/grokking-concurrency/csharp/part-7.md +84 -0
  366. package/lib/assets/docs/article/grokking-concurrency/csharp/part-8.md +92 -0
  367. package/lib/assets/docs/article/grokking-concurrency/fsharp/index.md +65 -0
  368. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-1.md +80 -0
  369. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-2.md +103 -0
  370. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-3.md +94 -0
  371. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-4.md +110 -0
  372. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-5.md +104 -0
  373. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-6.md +93 -0
  374. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-7.md +121 -0
  375. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-8.md +107 -0
  376. package/lib/assets/docs/article/grokking-concurrency/haskell/index.md +248 -0
  377. package/lib/assets/docs/article/grokking-concurrency/haskell/part-1.md +96 -0
  378. package/lib/assets/docs/article/grokking-concurrency/haskell/part-2.md +96 -0
  379. package/lib/assets/docs/article/grokking-concurrency/haskell/part-3.md +91 -0
  380. package/lib/assets/docs/article/grokking-concurrency/haskell/part-4.md +106 -0
  381. package/lib/assets/docs/article/grokking-concurrency/haskell/part-5.md +99 -0
  382. package/lib/assets/docs/article/grokking-concurrency/haskell/part-6.md +95 -0
  383. package/lib/assets/docs/article/grokking-concurrency/haskell/part-7.md +111 -0
  384. package/lib/assets/docs/article/grokking-concurrency/haskell/part-8.md +118 -0
  385. package/lib/assets/docs/article/grokking-concurrency/index.md +66 -0
  386. package/lib/assets/docs/article/grokking-concurrency/java/index.md +102 -0
  387. package/lib/assets/docs/article/grokking-concurrency/java/part-1.md +308 -0
  388. package/lib/assets/docs/article/grokking-concurrency/java/part-2.md +334 -0
  389. package/lib/assets/docs/article/grokking-concurrency/java/part-3.md +221 -0
  390. package/lib/assets/docs/article/grokking-concurrency/java/part-4.md +213 -0
  391. package/lib/assets/docs/article/grokking-concurrency/java/part-5.md +112 -0
  392. package/lib/assets/docs/article/grokking-concurrency/java/part-6.md +69 -0
  393. package/lib/assets/docs/article/grokking-concurrency/java/part-7.md +101 -0
  394. package/lib/assets/docs/article/grokking-concurrency/java/part-8.md +101 -0
  395. package/lib/assets/docs/article/grokking-concurrency/python/index.md +313 -0
  396. package/lib/assets/docs/article/grokking-concurrency/python/part-1.md +239 -0
  397. package/lib/assets/docs/article/grokking-concurrency/python/part-2.md +418 -0
  398. package/lib/assets/docs/article/grokking-concurrency/python/part-3.md +227 -0
  399. package/lib/assets/docs/article/grokking-concurrency/python/part-4.md +299 -0
  400. package/lib/assets/docs/article/grokking-concurrency/python/part-5.md +315 -0
  401. package/lib/assets/docs/article/grokking-concurrency/python/part-6.md +297 -0
  402. package/lib/assets/docs/article/grokking-concurrency/python/part-7.md +314 -0
  403. package/lib/assets/docs/article/grokking-concurrency/python/part-8.md +360 -0
  404. package/lib/assets/docs/article/grokking-concurrency/rust/index.md +270 -0
  405. package/lib/assets/docs/article/grokking-concurrency/rust/part-1.md +108 -0
  406. package/lib/assets/docs/article/grokking-concurrency/rust/part-2.md +120 -0
  407. package/lib/assets/docs/article/grokking-concurrency/rust/part-3.md +126 -0
  408. package/lib/assets/docs/article/grokking-concurrency/rust/part-4.md +175 -0
  409. package/lib/assets/docs/article/grokking-concurrency/rust/part-5.md +158 -0
  410. package/lib/assets/docs/article/grokking-concurrency/rust/part-6.md +94 -0
  411. package/lib/assets/docs/article/grokking-concurrency/rust/part-7.md +133 -0
  412. package/lib/assets/docs/article/grokking-concurrency/rust/part-8.md +155 -0
  413. package/lib/assets/docs/article/grokking-concurrency/scala/index.md +69 -0
  414. package/lib/assets/docs/article/grokking-concurrency/scala/part-1.md +78 -0
  415. package/lib/assets/docs/article/grokking-concurrency/scala/part-2.md +112 -0
  416. package/lib/assets/docs/article/grokking-concurrency/scala/part-3.md +93 -0
  417. package/lib/assets/docs/article/grokking-concurrency/scala/part-4.md +110 -0
  418. package/lib/assets/docs/article/grokking-concurrency/scala/part-5.md +119 -0
  419. package/lib/assets/docs/article/grokking-concurrency/scala/part-6.md +83 -0
  420. package/lib/assets/docs/article/grokking-concurrency/scala/part-7.md +131 -0
  421. package/lib/assets/docs/article/grokking-concurrency/scala/part-8.md +129 -0
  422. package/lib/assets/docs/article/grokkingfp/all/index.md +368 -0
  423. package/lib/assets/docs/article/grokkingfp/all/part-1-ch01-fp-introduction.md +530 -0
  424. package/lib/assets/docs/article/grokkingfp/all/part-1-ch02-pure-functions.md +923 -0
  425. package/lib/assets/docs/article/grokkingfp/all/part-2-ch03-immutable-data.md +1122 -0
  426. package/lib/assets/docs/article/grokkingfp/all/part-2-ch04-higher-order-functions.md +1104 -0
  427. package/lib/assets/docs/article/grokkingfp/all/part-2-ch05-flatmap.md +1026 -0
  428. package/lib/assets/docs/article/grokkingfp/all/part-3-ch06-option.md +777 -0
  429. package/lib/assets/docs/article/grokkingfp/all/part-3-ch07-either-adt.md +871 -0
  430. package/lib/assets/docs/article/grokkingfp/all/part-4-ch08-io-monad.md +972 -0
  431. package/lib/assets/docs/article/grokkingfp/all/part-4-ch09-streams.md +926 -0
  432. package/lib/assets/docs/article/grokkingfp/all/part-5-ch10-concurrency.md +870 -0
  433. package/lib/assets/docs/article/grokkingfp/all/part-6-ch11-application.md +715 -0
  434. package/lib/assets/docs/article/grokkingfp/all/part-6-ch12-testing.md +626 -0
  435. package/lib/assets/docs/article/grokkingfp/all/writing-plan.md +696 -0
  436. package/lib/assets/docs/article/grokkingfp/clojure/index.md +276 -0
  437. package/lib/assets/docs/article/grokkingfp/clojure/part-1.md +667 -0
  438. package/lib/assets/docs/article/grokkingfp/clojure/part-2.md +643 -0
  439. package/lib/assets/docs/article/grokkingfp/clojure/part-3.md +620 -0
  440. package/lib/assets/docs/article/grokkingfp/clojure/part-4.md +697 -0
  441. package/lib/assets/docs/article/grokkingfp/clojure/part-5.md +751 -0
  442. package/lib/assets/docs/article/grokkingfp/clojure/part-6.md +721 -0
  443. package/lib/assets/docs/article/grokkingfp/csharp/index.md +246 -0
  444. package/lib/assets/docs/article/grokkingfp/csharp/part-1.md +811 -0
  445. package/lib/assets/docs/article/grokkingfp/csharp/part-2.md +971 -0
  446. package/lib/assets/docs/article/grokkingfp/csharp/part-3.md +981 -0
  447. package/lib/assets/docs/article/grokkingfp/csharp/part-4.md +949 -0
  448. package/lib/assets/docs/article/grokkingfp/csharp/part-5.md +947 -0
  449. package/lib/assets/docs/article/grokkingfp/csharp/part-6.md +739 -0
  450. package/lib/assets/docs/article/grokkingfp/elixir/index.md +203 -0
  451. package/lib/assets/docs/article/grokkingfp/elixir/part-1.md +710 -0
  452. package/lib/assets/docs/article/grokkingfp/elixir/part-2.md +838 -0
  453. package/lib/assets/docs/article/grokkingfp/elixir/part-3.md +985 -0
  454. package/lib/assets/docs/article/grokkingfp/elixir/part-4.md +974 -0
  455. package/lib/assets/docs/article/grokkingfp/elixir/part-5.md +1284 -0
  456. package/lib/assets/docs/article/grokkingfp/elixir/part-6.md +1047 -0
  457. package/lib/assets/docs/article/grokkingfp/fsharp/index.md +210 -0
  458. package/lib/assets/docs/article/grokkingfp/fsharp/part-1.md +714 -0
  459. package/lib/assets/docs/article/grokkingfp/fsharp/part-2.md +961 -0
  460. package/lib/assets/docs/article/grokkingfp/fsharp/part-3.md +972 -0
  461. package/lib/assets/docs/article/grokkingfp/fsharp/part-4.md +832 -0
  462. package/lib/assets/docs/article/grokkingfp/fsharp/part-5.md +911 -0
  463. package/lib/assets/docs/article/grokkingfp/fsharp/part-6.md +920 -0
  464. package/lib/assets/docs/article/grokkingfp/haskell/index.md +234 -0
  465. package/lib/assets/docs/article/grokkingfp/haskell/part-1.md +591 -0
  466. package/lib/assets/docs/article/grokkingfp/haskell/part-2.md +866 -0
  467. package/lib/assets/docs/article/grokkingfp/haskell/part-3.md +915 -0
  468. package/lib/assets/docs/article/grokkingfp/haskell/part-4.md +876 -0
  469. package/lib/assets/docs/article/grokkingfp/haskell/part-5.md +845 -0
  470. package/lib/assets/docs/article/grokkingfp/haskell/part-6.md +842 -0
  471. package/lib/assets/docs/article/grokkingfp/index.md +143 -0
  472. package/lib/assets/docs/article/grokkingfp/java/index.md +211 -0
  473. package/lib/assets/docs/article/grokkingfp/java/part-1.md +646 -0
  474. package/lib/assets/docs/article/grokkingfp/java/part-2.md +667 -0
  475. package/lib/assets/docs/article/grokkingfp/java/part-3.md +672 -0
  476. package/lib/assets/docs/article/grokkingfp/java/part-4.md +771 -0
  477. package/lib/assets/docs/article/grokkingfp/java/part-5.md +959 -0
  478. package/lib/assets/docs/article/grokkingfp/java/part-6.md +1324 -0
  479. package/lib/assets/docs/article/grokkingfp/python/index.md +258 -0
  480. package/lib/assets/docs/article/grokkingfp/python/part-1.md +437 -0
  481. package/lib/assets/docs/article/grokkingfp/python/part-2.md +958 -0
  482. package/lib/assets/docs/article/grokkingfp/python/part-3.md +1004 -0
  483. package/lib/assets/docs/article/grokkingfp/python/part-4.md +765 -0
  484. package/lib/assets/docs/article/grokkingfp/python/part-5.md +747 -0
  485. package/lib/assets/docs/article/grokkingfp/python/part-6.md +861 -0
  486. package/lib/assets/docs/article/grokkingfp/ruby/index.md +330 -0
  487. package/lib/assets/docs/article/grokkingfp/ruby/part-1.md +753 -0
  488. package/lib/assets/docs/article/grokkingfp/ruby/part-2.md +938 -0
  489. package/lib/assets/docs/article/grokkingfp/ruby/part-3.md +946 -0
  490. package/lib/assets/docs/article/grokkingfp/ruby/part-4.md +921 -0
  491. package/lib/assets/docs/article/grokkingfp/ruby/part-5.md +908 -0
  492. package/lib/assets/docs/article/grokkingfp/ruby/part-6.md +1410 -0
  493. package/lib/assets/docs/article/grokkingfp/rust/index.md +242 -0
  494. package/lib/assets/docs/article/grokkingfp/rust/part-1.md +634 -0
  495. package/lib/assets/docs/article/grokkingfp/rust/part-2.md +1060 -0
  496. package/lib/assets/docs/article/grokkingfp/rust/part-3.md +994 -0
  497. package/lib/assets/docs/article/grokkingfp/rust/part-4.md +571 -0
  498. package/lib/assets/docs/article/grokkingfp/rust/part-5.md +705 -0
  499. package/lib/assets/docs/article/grokkingfp/rust/part-6.md +508 -0
  500. package/lib/assets/docs/article/grokkingfp/scala/index.md +171 -0
  501. package/lib/assets/docs/article/grokkingfp/scala/part-1.md +541 -0
  502. package/lib/assets/docs/article/grokkingfp/scala/part-2.md +946 -0
  503. package/lib/assets/docs/article/grokkingfp/scala/part-3.md +917 -0
  504. package/lib/assets/docs/article/grokkingfp/scala/part-4.md +742 -0
  505. package/lib/assets/docs/article/grokkingfp/scala/part-5.md +722 -0
  506. package/lib/assets/docs/article/grokkingfp/scala/part-6.md +865 -0
  507. package/lib/assets/docs/article/grokkingfp/typescript/index.md +273 -0
  508. package/lib/assets/docs/article/grokkingfp/typescript/part-1.md +559 -0
  509. package/lib/assets/docs/article/grokkingfp/typescript/part-2.md +1129 -0
  510. package/lib/assets/docs/article/grokkingfp/typescript/part-3.md +842 -0
  511. package/lib/assets/docs/article/grokkingfp/typescript/part-4.md +1085 -0
  512. package/lib/assets/docs/article/grokkingfp/typescript/part-5.md +717 -0
  513. package/lib/assets/docs/article/grokkingfp/typescript/part-6.md +980 -0
  514. package/lib/assets/docs/article/index.md +36 -0
  515. package/lib/assets/docs/design/index.md +39 -27
  516. package/lib/assets/docs/development/index.md +11 -1
  517. package/lib/assets/docs/index.md +33 -103
  518. package/lib/assets/docs/operation/index.md +16 -6
  519. package/lib/assets/docs/reference/index.md +5 -4
  520. package/lib/assets/docs/requirements/index.md +13 -6
  521. package/lib/assets/docs/review/index.md +5 -0
  522. package/lib/assets/docs/strategy/index.md +15 -0
  523. package/lib/assets/docs/template/index.md +9 -5
  524. package/lib/assets/mkdocs.yml +33 -19
  525. package/package.json +1 -1
  526. package/lib/assets/docs/analysis/index.md +0 -8
  527. /package/lib/assets/docs/{analysis → strategy}/slide/.gitkeep +0 -0
@@ -0,0 +1,631 @@
1
+ # 第 12 章: モナドとエラーハンドリング
2
+
3
+ ## 12.1 はじめに
4
+
5
+ 前章までに高階関数、カリー化、関数合成、ポイントフリースタイルを学びました。この章では Haskell の関数型プログラミングの中核概念である**モナド**を、エラーハンドリングと遅延評価という実践的な文脈で理解します。
6
+
7
+ モナドは抽象的な概念ですが、「文脈を持つ計算を連鎖させる仕組み」として捉えるとわかりやすくなります。この章では `Maybe` 型、`Either` 型、`do` 記法、遅延評価を順に学び、FizzBuzz の `safeGenerate`、`safeGenerateList`、`lazyStream` の実装とテストを通じて理解を深めます。
8
+
9
+ ### この章で学ぶこと
10
+
11
+ - `Maybe` 型による安全な値アクセス
12
+ - `Either` 型によるエラーハンドリング
13
+ - `safeGenerate` / `safeGenerateList` の実装とテスト
14
+ - `do` 記法によるモナドの連鎖
15
+ - 遅延評価と無限リスト(`lazyStream`)
16
+ - 他言語のエラーハンドリングとの比較
17
+
18
+ ## 12.2 Maybe 型 — 値の有無を表現する
19
+
20
+ ### Maybe の定義
21
+
22
+ `Maybe` 型は「値があるかもしれないし、ないかもしれない」という状態を型で表現します。
23
+
24
+ ```haskell
25
+ data Maybe a = Nothing | Just a
26
+ ```
27
+
28
+ `Maybe` は 2 つの値コンストラクタを持つ直和型です。
29
+
30
+ | コンストラクタ | 意味 | 例 |
31
+ |--------------|------|-----|
32
+ | `Nothing` | 値がない | 検索結果がない、変換に失敗した |
33
+ | `Just a` | 値 `a` がある | `Just "Fizz"`、`Just 42` |
34
+
35
+ ### FizzBuzz での活用
36
+
37
+ リストのインデックスアクセスを安全にする例を見てみましょう。
38
+
39
+ ```haskell
40
+ -- 安全なインデックスアクセス
41
+ safeIndex :: [a] -> Int -> Maybe a
42
+ safeIndex xs i
43
+ | i < 0 || i >= length xs = Nothing
44
+ | otherwise = Just (xs !! i)
45
+
46
+ -- 使用例
47
+ safeIndex (generateList 5) 2
48
+ -- => Just "Fizz"
49
+
50
+ safeIndex (generateList 5) 10
51
+ -- => Nothing
52
+ ```
53
+
54
+ 通常の `(!!)` はインデックスが範囲外のとき実行時エラーになりますが、`safeIndex` は `Nothing` を返すため、呼び出し側が安全に処理できます。
55
+
56
+ ### Maybe のパターンマッチ
57
+
58
+ ```haskell
59
+ displayResult :: Maybe String -> String
60
+ displayResult Nothing = "結果がありません"
61
+ displayResult (Just s) = "結果: " ++ s
62
+
63
+ displayResult (safeIndex (generateList 5) 2)
64
+ -- => "結果: Fizz"
65
+
66
+ displayResult (safeIndex (generateList 5) 10)
67
+ -- => "結果がありません"
68
+ ```
69
+
70
+ ### Maybe はモナドである
71
+
72
+ `Maybe` はモナドの一種です。モナドであるとは、`>>=`(バインド演算子)が定義されていることを意味します。
73
+
74
+ ```haskell
75
+ (>>=) :: Maybe a -> (a -> Maybe b) -> Maybe b
76
+ Nothing >>= _ = Nothing
77
+ (Just x) >>= f = f x
78
+ ```
79
+
80
+ `>>=` は「`Maybe a` の値が `Just x` なら関数 `f` に `x` を渡し、`Nothing` なら `Nothing` をそのまま返す」という動作をします。
81
+
82
+ ```haskell
83
+ -- Maybe の連鎖
84
+ safeIndex (generateList 5) 2 >>= \s -> Just (s ++ "!")
85
+ -- => Just "Fizz!"
86
+
87
+ safeIndex (generateList 5) 10 >>= \s -> Just (s ++ "!")
88
+ -- => Nothing (途中で Nothing なので後続の処理はスキップ)
89
+ ```
90
+
91
+ `Nothing` が途中で発生すると、以降の処理は自動的にスキップされます。これが「失敗するかもしれない計算の連鎖」です。
92
+
93
+ ## 12.3 Either 型 — エラー情報を保持する
94
+
95
+ ### Either の定義
96
+
97
+ `Maybe` は「値があるかないか」しか表現できません。エラーの原因を知りたい場合は `Either` を使います。
98
+
99
+ ```haskell
100
+ data Either a b = Left a | Right b
101
+ ```
102
+
103
+ | コンストラクタ | 慣習的な意味 | 例 |
104
+ |--------------|------------|-----|
105
+ | `Left a` | エラー(失敗) | `Left "正の整数を指定してください"` |
106
+ | `Right b` | 成功 | `Right "Fizz"` |
107
+
108
+ `Left` がエラー、`Right` が成功という慣習は、英語の "right" が「正しい」を意味することに由来します。
109
+
110
+ ### Either もモナドである
111
+
112
+ ```haskell
113
+ (>>=) :: Either a b -> (b -> Either a c) -> Either a c
114
+ Left e >>= _ = Left e
115
+ Right x >>= f = f x
116
+ ```
117
+
118
+ `Maybe` と同様に、`Left` が途中で発生すると以降の処理はスキップされます。`Maybe` との違いは、`Left` がエラーの情報を保持している点です。
119
+
120
+ ## 12.4 safeGenerate — Either によるエラーハンドリング
121
+
122
+ ### Red: safeGenerate のテスト
123
+
124
+ ```haskell
125
+ -- test/FizzBuzz/FizzBuzzSpec.hs(抜粋)
126
+ describe "safeGenerate" $ do
127
+ it "正の整数で成功する" $
128
+ safeGenerate 3 `shouldBe` Right "Fizz"
129
+
130
+ it "0 以下でエラーを返す" $
131
+ safeGenerate 0 `shouldBe` Left "正の整数を指定してください"
132
+
133
+ it "負数でエラーを返す" $
134
+ safeGenerate (-1) `shouldBe` Left "正の整数を指定してください"
135
+ ```
136
+
137
+ ### Green: safeGenerate の実装
138
+
139
+ ```haskell
140
+ -- src/FizzBuzz.hs
141
+ safeGenerate :: Int -> Either String String
142
+ safeGenerate n
143
+ | n <= 0 = Left "正の整数を指定してください"
144
+ | otherwise = Right (generate n)
145
+ ```
146
+
147
+ 型シグネチャを分解しましょう。
148
+
149
+ ```
150
+ safeGenerate :: Int -> Either String String
151
+ ^^^ ^^^^^^^^^^^^^^^^^^^
152
+ 入力 戻り値: エラー(String) または 成功(String)
153
+ ```
154
+
155
+ `Either String String` は「エラーメッセージ(`String`)か、FizzBuzz の結果(`String`)のどちらか」を表します。エラーの型と成功の型が異なる場合は、例えば `Either String Int` のように区別されます。
156
+
157
+ ### テストの実行
158
+
159
+ ```bash
160
+ $ stack test
161
+ FizzBuzz.FizzBuzzSpec
162
+ safeGenerate
163
+ 正の整数で成功する
164
+ 0 以下でエラーを返す
165
+ 負数でエラーを返す
166
+
167
+ 3 examples, 0 failures
168
+ ```
169
+
170
+ ### Either の活用: パターンマッチ
171
+
172
+ ```haskell
173
+ -- Either の結果をパターンマッチで処理する
174
+ handleResult :: Either String String -> String
175
+ handleResult (Left err) = "エラー: " ++ err
176
+ handleResult (Right value) = "成功: " ++ value
177
+
178
+ handleResult (safeGenerate 3)
179
+ -- => "成功: Fizz"
180
+
181
+ handleResult (safeGenerate 0)
182
+ -- => "エラー: 正の整数を指定してください"
183
+ ```
184
+
185
+ ## 12.5 safeGenerateList — Either のリスト版
186
+
187
+ ### Red: safeGenerateList のテスト
188
+
189
+ ```haskell
190
+ -- test/FizzBuzz/FizzBuzzSpec.hs(抜粋)
191
+ describe "safeGenerateList" $ do
192
+ it "正の整数で成功する" $
193
+ safeGenerateList 3 `shouldBe` Right ["1", "2", "Fizz"]
194
+
195
+ it "0 以下でエラーを返す" $
196
+ safeGenerateList 0 `shouldBe` Left "正の整数を指定してください"
197
+ ```
198
+
199
+ ### Green: safeGenerateList の実装
200
+
201
+ ```haskell
202
+ -- src/FizzBuzz.hs
203
+ safeGenerateList :: Int -> Either String [String]
204
+ safeGenerateList n
205
+ | n <= 0 = Left "正の整数を指定してください"
206
+ | otherwise = Right (generateList n)
207
+ ```
208
+
209
+ `Either String [String]` は「エラーメッセージか、FizzBuzz 文字列のリストのどちらか」を表します。
210
+
211
+ ## 12.6 do 記法によるモナドの連鎖
212
+
213
+ ### do 記法とは
214
+
215
+ `>>=` を使った連鎖は可読性が低くなることがあります。`do` 記法はモナドの連鎖を命令型プログラミングに近い見た目で記述するための構文糖衣です。
216
+
217
+ ```haskell
218
+ -- >>= を使った連鎖
219
+ safeGenerate 3 >>= \result1 ->
220
+ safeGenerate 5 >>= \result2 ->
221
+ Right (result1 ++ " and " ++ result2)
222
+ -- => Right "Fizz and Buzz"
223
+
224
+ -- do 記法で書き直す(等価)
225
+ do
226
+ result1 <- safeGenerate 3
227
+ result2 <- safeGenerate 5
228
+ Right (result1 ++ " and " ++ result2)
229
+ -- => Right "Fizz and Buzz"
230
+ ```
231
+
232
+ `<-` は「モナドから値を取り出す」操作です。`result1 <- safeGenerate 3` は「`safeGenerate 3` が `Right value` なら `value` を `result1` に束縛し、`Left err` ならそのまま `Left err` を返して以降の処理をスキップする」という意味です。
233
+
234
+ ### do 記法の脱糖衣
235
+
236
+ `do` 記法はコンパイラによって `>>=` に変換されます。
237
+
238
+ ```haskell
239
+ -- do 記法
240
+ safeFizzBuzzPair :: Int -> Int -> Either String String
241
+ safeFizzBuzzPair a b = do
242
+ x <- safeGenerate a
243
+ y <- safeGenerate b
244
+ return (x ++ ", " ++ y)
245
+
246
+ -- コンパイラが変換する形(等価)
247
+ safeFizzBuzzPair' :: Int -> Int -> Either String String
248
+ safeFizzBuzzPair' a b =
249
+ safeGenerate a >>= \x ->
250
+ safeGenerate b >>= \y ->
251
+ return (x ++ ", " ++ y)
252
+ ```
253
+
254
+ `return` はモナドの文脈に値を包む関数です。`Either` の場合、`return x = Right x` です。
255
+
256
+ ### エラーの自動伝播
257
+
258
+ `do` 記法の強力な点は、途中でエラー(`Left`)が発生すると自動的に後続の処理がスキップされることです。
259
+
260
+ ```haskell
261
+ safeFizzBuzzPair 3 5
262
+ -- => Right "Fizz, Buzz"
263
+
264
+ safeFizzBuzzPair 0 5
265
+ -- => Left "正の整数を指定してください"
266
+ -- (safeGenerate 0 が Left を返した時点で終了)
267
+
268
+ safeFizzBuzzPair 3 (-1)
269
+ -- => Left "正の整数を指定してください"
270
+ -- (safeGenerate (-1) が Left を返した時点で終了)
271
+ ```
272
+
273
+ この「エラーの自動伝播」は、Java の例外機構に似ていますが、型レベルで表現されるためコンパイラがエラーハンドリングの漏れを検出できます。
274
+
275
+ ### 複数の safeGenerate を連鎖する
276
+
277
+ ```haskell
278
+ -- 複数の値を安全に生成してリストにする
279
+ safeGenerateMultiple :: [Int] -> Either String [String]
280
+ safeGenerateMultiple = mapM safeGenerate
281
+
282
+ safeGenerateMultiple [1, 3, 5, 15]
283
+ -- => Right ["1", "Fizz", "Buzz", "FizzBuzz"]
284
+
285
+ safeGenerateMultiple [1, 0, 5]
286
+ -- => Left "正の整数を指定してください"
287
+ -- (0 の時点でエラー)
288
+ ```
289
+
290
+ `mapM` は「モナドの文脈で `map` を行う」関数です。リストの各要素に `safeGenerate` を適用し、1 つでも `Left` があれば全体が `Left` になります。
291
+
292
+ ## 12.7 遅延評価と無限リスト
293
+
294
+ ### Haskell の遅延評価
295
+
296
+ Haskell は**遅延評価**(lazy evaluation)を採用しています。式は「値が必要になるまで評価されない」のが原則です。
297
+
298
+ ```haskell
299
+ -- 無限リストの定義(遅延評価なので可能)
300
+ naturals :: [Int]
301
+ naturals = [1..]
302
+
303
+ -- 先頭 5 要素だけ取り出す(ここで初めて評価される)
304
+ take 5 naturals
305
+ -- => [1, 2, 3, 4, 5]
306
+ ```
307
+
308
+ `[1..]` は 1 から始まる無限リストですが、`take 5` で先頭 5 要素しか必要とされないため、5 要素分しか計算されません。
309
+
310
+ ### Red: lazyStream のテスト
311
+
312
+ ```haskell
313
+ -- test/FizzBuzz/FizzBuzzSpec.hs(抜粋)
314
+ describe "lazyStream" $ do
315
+ it "遅延ストリームから要素を取得できる" $ do
316
+ take 3 lazyStream `shouldBe` ["1", "2", "Fizz"]
317
+
318
+ it "15 番目の要素は 'FizzBuzz'" $
319
+ lazyStream !! 14 `shouldBe` "FizzBuzz"
320
+ ```
321
+
322
+ ### Green: lazyStream の実装
323
+
324
+ ```haskell
325
+ -- src/FizzBuzz.hs
326
+ lazyStream :: [String]
327
+ lazyStream = map generate [1..]
328
+ ```
329
+
330
+ `lazyStream` は `[1..]`(1 から始まる無限リスト)の各要素に `generate` を適用した無限リストです。遅延評価のおかげで、実際に必要な要素だけが計算されます。
331
+
332
+ ### テストの実行
333
+
334
+ ```bash
335
+ $ stack test
336
+ FizzBuzz.FizzBuzzSpec
337
+ lazyStream
338
+ 遅延ストリームから要素を取得できる
339
+ 15 番目の要素は 'FizzBuzz'
340
+
341
+ 2 examples, 0 failures
342
+ ```
343
+
344
+ ### 遅延評価の活用
345
+
346
+ 無限リストと高階関数を組み合わせると、宣言的なデータ処理が可能になります。
347
+
348
+ ```haskell
349
+ -- 最初の 10 個の "Fizz" を取得する
350
+ take 10 (filter (== "Fizz") lazyStream)
351
+ -- => ["Fizz","Fizz","Fizz","Fizz","Fizz","Fizz","Fizz","Fizz","Fizz","Fizz"]
352
+
353
+ -- 最初の 5 個の "FizzBuzz" を取得する
354
+ take 5 (filter (== "FizzBuzz") lazyStream)
355
+ -- => ["FizzBuzz","FizzBuzz","FizzBuzz","FizzBuzz","FizzBuzz"]
356
+
357
+ -- 100 番目から 105 番目までの FizzBuzz
358
+ take 5 (drop 99 lazyStream)
359
+ -- => ["Buzz","101","Fizz","103","104"]
360
+ ```
361
+
362
+ `filter` も遅延的に動作するため、無限リストに対して `filter` を適用しても問題ありません。`take` で必要な数だけ取り出せば、その分だけ計算が進みます。
363
+
364
+ ### 遅延評価の注意点
365
+
366
+ 遅延評価は強力ですが、注意点もあります。
367
+
368
+ | 利点 | 注意点 |
369
+ |------|--------|
370
+ | 無限データ構造を自然に扱える | メモリリーク(サンクの蓄積)が起こりうる |
371
+ | 必要な分だけ計算される | デバッグ時に評価タイミングがわかりにくい |
372
+ | モジュール性が向上する | 正格評価が必要な場合は `seq` や `BangPatterns` を使う |
373
+
374
+ ## 12.8 全テストの実行
375
+
376
+ 第 4 部で追加したすべてのテストを実行します。
377
+
378
+ ```bash
379
+ $ stack test
380
+ FizzBuzz.FizzBuzzSpec
381
+ generate
382
+ 1 を渡すと '1' を返す
383
+ 2 を渡すと '2' を返す
384
+ 3 の倍数を渡すと 'Fizz' を返す
385
+ 5 の倍数を渡すと 'Buzz' を返す
386
+ 15 の倍数を渡すと 'FizzBuzz' を返す
387
+ 30 を渡すと 'FizzBuzz' を返す
388
+ generateList
389
+ 100 件のリストを生成する
390
+ 最初の要素は '1'
391
+ 3 番目の要素は 'Fizz'
392
+ 5 番目の要素は 'Buzz'
393
+ 15 番目の要素は 'FizzBuzz'
394
+ generateWith
395
+ カスタムルールで生成できる
396
+ transform
397
+ リストを変換できる
398
+ filterList
399
+ リストをフィルタリングできる
400
+ compose
401
+ 2 つの関数を合成できる
402
+ safeGenerate
403
+ 正の整数で成功する
404
+ 0 以下でエラーを返す
405
+ 負数でエラーを返す
406
+ lazyStream
407
+ 遅延ストリームから要素を取得できる
408
+ 15 番目の要素は 'FizzBuzz'
409
+ safeGenerateList
410
+ 正の整数で成功する
411
+ 0 以下でエラーを返す
412
+
413
+ Finished in 0.0003 seconds
414
+ 21 examples, 0 failures
415
+ ```
416
+
417
+ ## 12.9 他言語との比較
418
+
419
+ ### Elixir の {:ok, _} / {:error, _} タプル
420
+
421
+ Elixir はタグ付きタプルでエラーを表現します。
422
+
423
+ ```elixir
424
+ # Elixir
425
+ def safe_generate(number) when is_integer(number) and number > 0 do
426
+ {:ok, generate(number)}
427
+ end
428
+
429
+ def safe_generate(_), do: {:error, :non_positive}
430
+
431
+ # パターンマッチで処理
432
+ case safe_generate(3) do
433
+ {:ok, value} -> "成功: #{value}"
434
+ {:error, reason} -> "エラー: #{reason}"
435
+ end
436
+ ```
437
+
438
+ ```haskell
439
+ -- Haskell
440
+ safeGenerate :: Int -> Either String String
441
+ safeGenerate n
442
+ | n <= 0 = Left "正の整数を指定してください"
443
+ | otherwise = Right (generate n)
444
+
445
+ -- パターンマッチで処理
446
+ case safeGenerate 3 of
447
+ Right value -> "成功: " ++ value
448
+ Left err -> "エラー: " ++ err
449
+ ```
450
+
451
+ | 特徴 | Haskell `Either` | Elixir タグ付きタプル |
452
+ |------|-----------------|-------------------|
453
+ | 型安全性 | コンパイル時に型チェック | 動的型付け(Dialyzer で補助) |
454
+ | モナド連鎖 | `do` 記法 / `>>=` | `with` 構文 |
455
+ | 網羅性チェック | コンパイラが警告 | なし(ランタイムエラー) |
456
+ | エラー情報 | `Left` に任意の型 | `{:error, reason}` |
457
+
458
+ Elixir の `with` 構文は Haskell の `do` 記法に近い役割を果たします。
459
+
460
+ ```elixir
461
+ # Elixir: with 構文
462
+ with {:ok, x} <- safe_generate(3),
463
+ {:ok, y} <- safe_generate(5) do
464
+ {:ok, "#{x}, #{y}"}
465
+ end
466
+ ```
467
+
468
+ ```haskell
469
+ -- Haskell: do 記法
470
+ do
471
+ x <- safeGenerate 3
472
+ y <- safeGenerate 5
473
+ Right (x ++ ", " ++ y)
474
+ ```
475
+
476
+ ### Rust の Result / Option
477
+
478
+ Rust の `Result<T, E>` と `Option<T>` は Haskell の `Either` と `Maybe` に直接対応します。
479
+
480
+ ```rust
481
+ // Rust
482
+ fn safe_generate(n: i32) -> Result<String, String> {
483
+ if n <= 0 {
484
+ Err("正の整数を指定してください".to_string())
485
+ } else {
486
+ Ok(generate(n))
487
+ }
488
+ }
489
+
490
+ // ? 演算子でエラー伝播
491
+ fn safe_fizzbuzz_pair(a: i32, b: i32) -> Result<String, String> {
492
+ let x = safe_generate(a)?;
493
+ let y = safe_generate(b)?;
494
+ Ok(format!("{}, {}", x, y))
495
+ }
496
+ ```
497
+
498
+ ```haskell
499
+ -- Haskell
500
+ safeGenerate :: Int -> Either String String
501
+ safeGenerate n
502
+ | n <= 0 = Left "正の整数を指定してください"
503
+ | otherwise = Right (generate n)
504
+
505
+ -- do 記法でエラー伝播
506
+ safeFizzBuzzPair :: Int -> Int -> Either String String
507
+ safeFizzBuzzPair a b = do
508
+ x <- safeGenerate a
509
+ y <- safeGenerate b
510
+ Right (x ++ ", " ++ y)
511
+ ```
512
+
513
+ | 概念 | Haskell | Rust |
514
+ |------|---------|------|
515
+ | 値の有無 | `Maybe a` (`Nothing` / `Just a`) | `Option<T>` (`None` / `Some(T)`) |
516
+ | エラーハンドリング | `Either e a` (`Left e` / `Right a`) | `Result<T, E>` (`Err(E)` / `Ok(T)`) |
517
+ | エラー伝播 | `do` 記法 / `>>=` | `?` 演算子 |
518
+ | パターンマッチ | `case ... of` | `match` |
519
+ | モナド連鎖 | Monad 型クラス | `and_then` メソッド |
520
+
521
+ Rust の `?` 演算子は Haskell の `do` 記法内の `<-` に相当します。どちらもエラーの自動伝播を実現しますが、Haskell ではモナドという一般的な仕組みの一部として提供されています。
522
+
523
+ ### Java の Optional / 例外
524
+
525
+ Java は従来の例外機構に加え、Java 8 で `Optional<T>` が導入されました。
526
+
527
+ ```java
528
+ // Java
529
+ Optional<String> safeGenerate(int n) {
530
+ if (n <= 0) return Optional.empty();
531
+ return Optional.of(generate(n));
532
+ }
533
+
534
+ // flatMap でチェーン
535
+ Optional<String> result = safeGenerate(3)
536
+ .flatMap(x -> safeGenerate(5)
537
+ .map(y -> x + ", " + y));
538
+ ```
539
+
540
+ ```haskell
541
+ -- Haskell(Maybe 版)
542
+ safeGenerateMaybe :: Int -> Maybe String
543
+ safeGenerateMaybe n
544
+ | n <= 0 = Nothing
545
+ | otherwise = Just (generate n)
546
+
547
+ -- do 記法でチェーン
548
+ result = do
549
+ x <- safeGenerateMaybe 3
550
+ y <- safeGenerateMaybe 5
551
+ Just (x ++ ", " ++ y)
552
+ ```
553
+
554
+ Java の `Optional.flatMap` は Haskell の `>>=` に対応し、`Optional.map` は `fmap` に対応します。ただし Java の `Optional` は `null` の代替であり、Haskell の `Maybe` のような一般的なモナドの仕組みは持ちません。
555
+
556
+ ## 12.10 まとめ: Haskell の純粋関数型プログラミング
557
+
558
+ ### 第 4 部の振り返り
559
+
560
+ 第 4 部を通じて、以下の関数型プログラミングのテクニックを FizzBuzz の実装で実践しました。
561
+
562
+ | 章 | テーマ | 主な概念 |
563
+ |----|--------|---------|
564
+ | 第 10 章 | 高階関数とカリー化 | `map`、`filter`、`foldl`、`generateWith`、部分適用 |
565
+ | 第 11 章 | 関数合成とポイントフリー | `(.)`、`($)`、ポイントフリースタイル、`compose` |
566
+ | 第 12 章 | モナドとエラーハンドリング | `Maybe`、`Either`、`do` 記法、遅延評価 |
567
+
568
+ ### Haskell の純粋関数型プログラミングの特徴
569
+
570
+ 1. **純粋性**: すべての関数は副作用を持たず、同じ入力に対して常に同じ出力を返す。`safeGenerate 3` は常に `Right "Fizz"` を返す
571
+ 2. **型安全性**: `Maybe` と `Either` でエラーを型レベルで表現し、コンパイラがエラーハンドリングの漏れを検出する
572
+ 3. **遅延評価**: `lazyStream` のような無限データ構造を自然に扱え、必要な分だけ計算する
573
+ 4. **高階関数とカリー化**: 関数を自在に組み合わせ、部分適用で新しい関数を生成する
574
+ 5. **関数合成**: 小さな関数を組み合わせて大きな処理を構築する
575
+ 6. **モナド**: `do` 記法で「文脈を持つ計算の連鎖」を命令型に近い見た目で書ける
576
+
577
+ ### FizzBuzz の最終形
578
+
579
+ ```haskell
580
+ module FizzBuzz
581
+ ( generate, generateList, generateWith, transform, filterList
582
+ , compose, safeGenerate, lazyStream, safeGenerateList
583
+ ) where
584
+
585
+ -- 基本の FizzBuzz 生成
586
+ generate :: Int -> String
587
+ generate n
588
+ | n `mod` 15 == 0 = "FizzBuzz"
589
+ | n `mod` 3 == 0 = "Fizz"
590
+ | n `mod` 5 == 0 = "Buzz"
591
+ | otherwise = show n
592
+
593
+ -- リスト生成(map の活用)
594
+ generateList :: Int -> [String]
595
+ generateList n = map generate [1..n]
596
+
597
+ -- 高階関数(ルールの注入)
598
+ generateWith :: (Int -> String) -> Int -> String
599
+ generateWith rule = rule
600
+
601
+ -- ポイントフリースタイルの高階関数
602
+ transform :: (a -> b) -> [a] -> [b]
603
+ transform = map
604
+
605
+ filterList :: (a -> Bool) -> [a] -> [a]
606
+ filterList = filter
607
+
608
+ -- 関数合成
609
+ compose :: (b -> c) -> (a -> b) -> a -> c
610
+ compose = (.)
611
+
612
+ -- Either によるエラーハンドリング
613
+ safeGenerate :: Int -> Either String String
614
+ safeGenerate n
615
+ | n <= 0 = Left "正の整数を指定してください"
616
+ | otherwise = Right (generate n)
617
+
618
+ -- 遅延評価による無限ストリーム
619
+ lazyStream :: [String]
620
+ lazyStream = map generate [1..]
621
+
622
+ -- Either によるリスト版エラーハンドリング
623
+ safeGenerateList :: Int -> Either String [String]
624
+ safeGenerateList n
625
+ | n <= 0 = Left "正の整数を指定してください"
626
+ | otherwise = Right (generateList n)
627
+ ```
628
+
629
+ この最終形は、TDD のサイクル(Red → Green → Refactor)を繰り返しながら、関数型プログラミングのテクニックを段階的に積み上げた結果です。各関数は小さく、型シグネチャが仕様を語り、テストが振る舞いを保証しています。
630
+
631
+ Haskell の純粋関数型プログラミングは、「変更を楽に安全にできるソフトウェア」を実現するための強力なアプローチです。型による安全性の保証、純粋関数によるテスタビリティの高さ、関数合成によるモジュール性の向上が、その核心にあります。
@@ -0,0 +1,49 @@
1
+ # テスト駆動開発から始める Haskell 入門
2
+
3
+ 純粋関数型プログラミング言語 Haskell で、TDD(テスト駆動開発)を実践しながら FizzBuzz を段階的に構築していきます。
4
+
5
+ ## 対象読者
6
+
7
+ - プログラミングの基礎知識を持つ開発者
8
+ - 純粋関数型言語と TDD に興味がある方
9
+ - 型クラスや代数的データ型を実践的に学びたい方
10
+
11
+ ## 開発環境
12
+
13
+ | ツール | バージョン | 用途 |
14
+ |--------|-----------|------|
15
+ | GHC | 9.8.4 | Haskell コンパイラ |
16
+ | Stack | 3.7.1 | ビルドツール・パッケージマネージャ |
17
+ | HSpec | 2.11.12 | BDD スタイルテストフレームワーク |
18
+ | HLint | 3.10 | 静的解析ツール |
19
+ | Nix | - | 開発環境管理 |
20
+
21
+ ## 記事構成
22
+
23
+ ### 第 1 部: TDD の基本サイクル
24
+
25
+ 1. [TODO リストと最初のテスト](01-todo-list-and-first-test.md)
26
+ 2. [仮実装と三角測量](02-fake-it-and-triangulation.md)
27
+ 3. [明白な実装とリファクタリング](03-obvious-implementation-and-refactoring.md)
28
+
29
+ ### 第 2 部: 開発環境と自動化
30
+
31
+ 4. [バージョン管理と Conventional Commits](04-version-control-and-conventional-commits.md)
32
+ 5. [パッケージ管理と静的解析](05-package-management-and-static-analysis.md)
33
+ 6. [タスクランナーと CI/CD](06-task-runner-and-ci-cd.md)
34
+
35
+ ### 第 3 部: 型クラスと代数的データ型
36
+
37
+ 7. [代数的データ型と型クラスによるポリモーフィズム](07-algebraic-data-types-and-type-classes.md)
38
+ 8. [パターンマッチとガード](08-pattern-matching-and-guards.md)
39
+ 9. [モジュール設計とスマートコンストラクタ](09-module-design-and-smart-constructors.md)
40
+
41
+ ### 第 4 部: 関数型プログラミング
42
+
43
+ 10. [高階関数とカリー化](10-higher-order-functions-and-currying.md)
44
+ 11. [関数合成とポイントフリースタイル](11-function-composition-and-point-free.md)
45
+ 12. [モナドとエラーハンドリング](12-monad-and-error-handling.md)
46
+
47
+ ## ソースコード
48
+
49
+ 実装コードは [`apps/haskell/`](https://github.com/k2works/getting-started-tdd/tree/main/apps/haskell) にあります。