21

私は現在、「Learn You a Haskell for Great Good」で Haskell を学ぼうとしている完全な初心者です。コマンドライン引数の操作方法を説明するセクションにたどり着きましたが、何かが私を悩ませています。

私の理解 (およびhaskell.org の定義) から、アクションは副作用をカプセル化するためのものです。コマンドライン引数は、プログラムの特定のインスタンスに対する不変の入力getProgName :: IO StringですgetProgName :: String。別の言い方をすれば、純粋な関数が呼び出されないようにするポイントは何getProgNameですか?

アップデート

これまでのところ、この質問に対していくつかの素晴らしい答えがありました。Don Stewart の記事が最も単純で簡潔なものであると私は認めますが、 Conal の記事(関連するブログ投稿を含む) は一読の価値があります。

4

3 に答える 3

25

まず、getArgs実行時に変更できます。を参照してくださいwithArgs

第二に、不純な計算の興味深いクラスgetArgsgetProgName分類されます。これらは、プログラムの実行中は定数と見なされますが、コンパイル時に使用できる値ではなく、プログラムの実行ごとに変化します。それらには明確な意味がありません。

たとえば、getArgs と浮動小数点計算が説明されている以前の説明を参照してください。また、minBound/maxBound もこのクラスに属すると考えることができます。

于 2013-01-12T17:51:32.387 に答える
24

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 は純粋に関数型の言語ですか? .

于 2013-01-12T19:03:24.653 に答える
3

私の理解では、純粋な関数は「コード時」に推論でき、コンパイラーはコンパイル時に推論できるため、純粋です。IO アクションはランタイムに依存します。getArgs実行時にのみプログラムに引数を与える IO アクションです。

Learn you として、Haskell は次のように述べています。

I/O アクションは、現実世界に出てそこで何かを行い (壁に落書きを書くなど)、データを持ち帰る小さな足の付いた箱と考えることができます。

コード時またはコンパイル時に、足の小さなボックスが何をもたらすかはわかりません。

于 2013-01-12T17:58:50.450 に答える