あなたは完全に正しいです:何も返さない関数を計算することは無意味です-あなたが数学関数について話しているなら。しかし、多くの数学の概念と同様に、「関数」は多くのプログラミング言語では数学関数にのみ関連していますが、動作は多少異なります。
誤解しない言語で説明するのは良いことだと思います。そのような言語の1つがHaskellです。これは純粋に関数型言語であり、Haskell関数も数学関数であることを意味します。実際、Haskell関数をもっと数学的なスタイルで書くことができます。
my_tan(x) = sin(x)/cos(x) -- or (preferred): tan' x = sin x / cos x
C++よりも
double my_tan(double x) { return sin(x)/cos(x); }
しかし、コンピュータプログラムでは、関数を計算するだけではありませんか?また、画面に何かを表示したり、ネットワーク経由でデータを送信したり、センサーから値を読み取ったりするなどの作業も行います。Haskellでは、これらのようなものは純粋関数から十分に分離されており、すべていわゆるIO
モナドで機能します。 。たとえば、putStrLn
文字の行を出力する関数のタイプはString -> IO()
。です。String
つまり、引数としてaを取り、関数IO
から呼び出されたときにその文字列を出力するアクションを返しますが、それ以外は何も返しません(親はおおよそC ++にあるものです)。main
()
void
このIOの実行方法には多くの利点がありますが、ほとんどのプログラミング言語はより雑然としています。すべての関数でIOを実行でき、プログラムの内部状態を変更することもできます。したがって、C ++では、単純に関数を使用できます。この関数void putStrLn(std::string)
は、文字列だけを出力するIOアクションを「返す」こともできますが、明示的には指示しません。利点は、IOモナドが実際に何であるかを考えるときに、脳内で複数の結び目を結ぶ必要がないことです(かなり回り道です)。また、実際にマシンに「この一連のプロセスを実行してください」と指示する機能があれば、多くのアルゴリズムを実装してより高速に実行できます。IOモナドでの計算結果を要求するだけではありません。