メッセージ。 - にゃー
# にゃー
たとえば、普通の(遅延評価のない)プログラミング言語では、関数の適用順序は一通りしかない。f(1)は「fという関数を1に適用する」ということだし、f(1+1)は「fという関数を1+1の結果である2に適用する」ということだ。
後者のf(1+1)では、1+1=2が終了した後でしかfは適用されない。関数fが適用されたとき、fは渡された引数の値が何であるかを知るが、それがどうやって導出されたかを知らないし、知ることはできない。なぜなら、もう評価されて値になってしまったものが引数の値として渡されるから。
でも、遅延評価の言語では事情が異なる。f(1+1)と記述され、fが1+1に適用されるとき、関数fに引数として渡されたものは、「2」ではなく「1+1」だ。だからfの定義として、「引数として渡されてくるのは2つの数値の足し算だ。だからfよ、お前は足し算がなされる前の数値をそれぞれ2倍にして足し算するのだぞ」と定義してやれば、実際そういった計算ができる。f(1+1)は、1*2 + 1*2 = 4という結果に評価される。
少なくとも理論上はそういうことができる。で、その理論上できることをプログラムの記述上どのように表記するのか、という問題に1つの解を与えたものが、FunctorとかMonadとかです。…ってことであってますかね?
後者のf(1+1)では、1+1=2が終了した後でしかfは適用されない。関数fが適用されたとき、fは渡された引数の値が何であるかを知るが、それがどうやって導出されたかを知らないし、知ることはできない。なぜなら、もう評価されて値になってしまったものが引数の値として渡されるから。
でも、遅延評価の言語では事情が異なる。f(1+1)と記述され、fが1+1に適用されるとき、関数fに引数として渡されたものは、「2」ではなく「1+1」だ。だからfの定義として、「引数として渡されてくるのは2つの数値の足し算だ。だからfよ、お前は足し算がなされる前の数値をそれぞれ2倍にして足し算するのだぞ」と定義してやれば、実際そういった計算ができる。f(1+1)は、1*2 + 1*2 = 4という結果に評価される。
少なくとも理論上はそういうことができる。で、その理論上できることをプログラムの記述上どのように表記するのか、という問題に1つの解を与えたものが、FunctorとかMonadとかです。…ってことであってますかね?
Comment
Trackback