eこのような質問に答えるには、基礎が必要です。式に型があるとはどういう意味tですか? のようなプリミティブに対して任意の答えを与えることができますgetProgNameが、そうする必要はありません。代わりに、式と型の意味を調べてください。で表される値(つまり、数学的な値としての の意味) が で表されるコレクションに属する場合、式eは型を持つとします。teet
を考えてみましょうt == String。私たちはどんな意味を持ちたいStringですか?繰り返しますが、ここには選択の余地がたくさんあります。ただし、最も単純な数学的定義を持つ有用な候補を選択することには、多くのメリットがあります。Haskellでは、実際にはとString == [Char]の意味について話しています。
私が知っている最も説得力のある単純な候補は、 がリスト (シーケンス) を示し、文字を示し、その結果、文字のシーケンス、つまり「文字列」を示します。[]Char[]CharString
文字列を意味する選択でString、今、私たちはそれが可能かどうかを尋ねる立場にありますgetProgName :: String. もしそうなら、 の意味はgetProgName一連の文字でなければなりません。ただし、の背後にある意図を捉える単一getProgNameの文字列はありません。(編集: おそらく、異なる名前のプログラムに現れたときに異なる文字列を生成したいでしょうgetProgName。) したがって、 (必ずしもそうとは限りませんが) のような異なる型IO Stringを選択するか、より複雑な意味を選択する必要があります。 String. 後者のルートは、深い意味を考慮するまでは、最初は魅力的に見えるかもしれません。純粋に関数型 (より正確には「指示的」) プログラミングは、オペレーティング システムやマシン実行コンテキストなど、ある種の環境からの関数のような複雑な意味ではなく、シーケンスのような単純な意味です。
密接に関連する発言や議論については、ブログ投稿Notions of pure Haskell を参照してください。
編集:ピーター・ランディン (Haskell の祖父) は、「宣言的」プログラミングや「関数型」プログラミングなどのあいまいな用語の実質的な代替として彼が推奨した「表示型プログラミング」(または「真の関数型プログラミング」) の定義でそれを最もよく表現したと思います。 . 参照、引用、および簡単な解説については、投稿のこのコメントを参照してください。 Haskell は純粋に関数型の言語ですか? .