DEV Community

Ken Okabe
Ken Okabe

Posted on

関数型プログラマーにとっての関数型プログラミングと命令型・オブジェクト指向のイメージ

functional programming layer

  • プログラミングの本質は数学的構造の構築

  • 現実世界で時間変化する値に紐づく構造も例外ではない(FRP)

  • コンピュータのハードウェアのリソースは有限であり、計算速度、メモリの物理的制約がある

  • したがって数学構造をそのままハードウェアにマッピングするのは無理

  • そもそも命令型プログラミング、オブジェクト指向(定義の流派問題はとばす)は、数学よりもハードウェアの挙動(時間的変化)に素朴な感覚で着想しデザインされている

  • 数学は本質的にシンプルで論理構造に無駄がなく間違いがない

  • 少なくとも構造を定義するときに間違いがあれば見つけやすい

  • 人間の思いつきや発明、方針、設計には間違いが多い、余計な発明をして問題を複雑にする事を好む

  • 人間の間違いは見つけにくい

  • 間違っていることが明らかであっても間違いを認めず政治的論争になることもある

  • 複雑な構造のほうがいいと信奉する人間はプログラマーに向いていないし、時間の無駄だし、KISSの原則を学べ

  • プログラミング = 数学 + 人間のエンジニアリング

  • いろいろ思いついて発明して人間のエンジニアリングの層を厚くしようとするな、人間はそれほど賢くない

  • 数学の土台に手を加える人間のエンジニアリングの層(Wrapper)は薄いほうが望ましい

  • なぜならば、そのほうが間違うリスクを最小にできるから

  • だから関数型プログラミングのアプローチはより優れている

  • オブジェクト指向は、本来、関数、代数構造という数学で実現可能なコードをオブジェクト、クラスという人間の発明で実現しようとした

  • 人間の思いつきや発明、方針、設計には間違いがあるので案の定失敗して、今では回避される傾向にある

  • 当初のカプセル化、継承によりコードが良くなるという哲学はなかったことにされて「正しいオブジェクト指向」とかゴールポストを動かして正当化しようとする人たちは未だに多いのだが、そういうことじゃないから

  • 数学、数学構造は堅牢であり、人間の発想により活用はされるが、時間が経過して、やっぱり使いにくい発明だった、とかゴールポストが動いて元来の方針がチャラになるようなことはない

  • 関数型言語の差異は薄いWrapperであり、本質的に習得した数学部分の知識が無駄になることはない、ずっと共通して使い回せる

  • 図の左側はC#、右側はF#、Microsoft.Netのツートップではあるが、比較するとF#は極端なまでに使われていないし虐げられてるとすら言える(MAUI初日からサポートしてくれという嘆き)、それでも.netの威力で関数型言語の中ではトップクラスに使われている言語なのでもっと増えて欲しいし、MSはもっと大規模な資本投下をF#にむけてすべき

Top comments (0)