関数脳続き

もう少し思い付いた事をメモしておく。
あとでまとめる(そしておそらく忘れられて放置される)。

  • 「金槌を持ったら全てが釘に見える」の例を真似て、「オブジェクト指向を持ったら全てがオブジェクトとメソッドに見える」し、「関数指向を持ったら全てが関数と関数適用に見える」。それが良いか悪いかは別として。
  • よくある、副作用を持つオブジェクト(指向)では、時間の概念を持つオブジェクト(履歴等)を上手く扱えない。
    • この場合でも、オブジェクトはimmutableであるものとし、状態の変更を「別の状態を持つ新たなオブジェクトをspawnし、そっちを指すようにする」実装にすれば上手く扱える。しかし、それよりも……。
  • 副作用を持たない(或いは、副作用の有無を明示的に扱うような)関数型言語なら、このようなオブジェクトを自然に扱える。
  • これはつまり、「過去」にアクセスできるという事。
  • 逆に、遅延評価を使えば、まだ見ぬ「未来」を扱う事も出来る。
  • つまり、時間操作。
  • そこに、継続が登場する。
  • 継続はそれ単体でも副作用を持つが、継続を使えば、現在の状態を持ったまま「過去」に戻ったり、そこから「未来」に帰ったりできる為、継続を利用する状況自体が副作用を求めている事が多い。例えば、「過去」に「未来の結果」を渡して戻ったり、「過去の改変」を行ったり、「あの時点で別の引数を渡してもう一度やり直」したり、「とりあえずここで一旦中断しておいて、続きはまた今度」(コルーチン)のような、副作用や状態をバリバリに持つ操作をする事が多い。
  • これらの時間移動(タイムマシン?)は、現実世界には存在しない操作なので、普通に生きている人がこの概念を必要とする事は少ない為、学ぶ機会に乏しい。
    • これらの概念を効率良く学ぶには、そういう概念が出てくるSF小説やゲームが今のところ、一番のような気がする。
  • 「過去」「未来」にread onlyでアクセスする場合は、副作用無しで関数型言語で扱える。
  • 「過去」「未来」に破壊的変更有りでアクセスする場合は、特定の段階の継続を掴んで扱える機能(schemeのcall/ccや、アセンブラでならプログラムカウンタとスタックの保存等)が欲しい。
  • ただ単に「ここでyesと答えたら未来はどうなるか、noと答えたら未来はどうなるか」という問いに対してなら、多世界解釈を採用する事で、副作用無しに実装する事が出来る。
    • 逆に言うと、イーガン的(プレ塵理論的)に考えた場合、「計算した」時点で、それは存在している訳なので、「yesと答えた未来」も「noと答えた未来」も両方並列に確かに存在している。だから、副作用無しで扱う場合には、多世界解釈を採用するしか無い。


追記: この辺を実世界にマッピングする場合

  • 現実物理世界に対しては、「過去」「未来」へのアクセスは不可能。
  • 脳内写像世界に対しては、「過去」へのアクセスは「記憶」という形で可能。「未来」へのアクセスは「予定」(つまり、○○する約束(promise)=明示的な遅延評価指定=あとでやる)という形で可能。