ハスケルでの印刷は純粋な関数です。なぜ、または、どうしてですか?私はそれが純粋な関数と同じ値を返すとは限らないためではないと思っています。Haskellは純粋な関数ですか?
答えて
純関数のタグ(同じ引数値で与えられた同じ結果値に常に評価され、意味論的に観察可能な副作用または出力を引き起こさない関数、たとえば、変更可能なオブジェクトまたは出力I/Oデバイスへ)し、印刷の種類に考える:。
putStrLn :: String -> IO()
あなたがそこにトリックを見つけるでしょう、それは常にIO()
を返し、そう... ん、それは効果をもたらす。したがって、Referential Transparencyは純粋ではありません たとえば、getLine
はIO String
を返しますが、純粋な関数でもあります。私が言うことをしようとしている何(@interjay貢献)、答えは質問の非常に近い依存することである:
値の問題では、IO()
は常に同じ入力に対して同じIO()
値になります。実行の問題について
そして
その IO()
の実行が副作用を持っている可能性があるため、それは純粋ではない(この 場合には、画面に文字列を入れたので、罪のないように見えますが、あなたがここに@Benの素敵なアプローチをよりよく理解することができ、いくつかのIOはランチ核爆弾ができた、と は、その後のInt 42を返す)
:
"実際に を「純粋に」操作する方法を説明する方法はいくつかあります。 IOはまったく同じ状態のモナドのようですが、 の状態はあなたの プログラムの外の世界全体です; =(あなたのスタッフ - > IO DBThing関数は本当に余分な 隠された引数を受け取り、世界を受け取ります実際には別の世界と一緒に DBThingを返します;これはいつも異なる の世界で呼び出されます。そのため、同じStuffで呼び出されたときに別のDBThing値を返すことがあります。 )別の説明は、IO DBThing値自体が命令的プログラムであることです。 。あなたのHaskellのプログラムは、IOを行い不純なプログラム を返さないIOを、やっていない、完全に純粋な機能、およびHaskellのランタイムシステム(impurely)」それは返す プログラムを実行
そして@Erik Allik 次のとおりです。
タイプIOの値を返すので、Haskellの機能、実行時に実際に実行されている 機能ではありません - 。何 実行されますと、IOは、したがって、これらの機能は、実際に純粋であるが、 その値そのものであります戻り値は非purを表します。計算。
Sneaky Haskell :) – HFBrowning
@HFBrowningその理由は何ですか? ...なぜモナドのルールなのか、それはみんながhaskellを愛している理由なのです。純粋な関数、純粋な関数、純粋な愛ahaahah –
明らかにそれは型に必要なので常にIO()を返しますが、常にIO()の_same_値を返します。 – Lee
タイプIO Int
の値が本当にInt
ではありませんそれらを見つけたことができます。これは、 "Haskellの実行時代、そのような方法でInt
の値を生成してください"と読む紙のようなものです。たとえ最終的にランタイムによって生成されたInt
が異なっていても、紙片は不活性であり、同じままです。
main
に割り当てることで、用紙をランタイムに送信します。 IO
アクションがmain
の方法ではなく、コンテナの中で衰えていない場合は、決して実行されません。
IO
アクションを返す関数は、他のアクションと同様に純粋です。彼らは常に同じ紙を返します。これらの命令でランタイムが行うことは別の問題です。
彼らはは純粋」tをweren場合
foo :: (Int -> IO Int) -> IO Int
foo f = let x = f 0 in liftA2 (+) x x
実行時に 'IO X' 'X'は実際には同じように表されます。コンパイラは 'IO X'がどのように振る舞うかについて特別なことを知っているだけです(そして、純粋な値がどう振る舞うかについての特別なこと - 違反する可能性のある仮定!これらの前提を使用して最適化されたコードを生成します。命令(すなわち、「紙片」)としてのIOのビューは依然として有用である。 「実行時の値」に関連するものではなく、「論理オブジェクトとしての値」に関するものと考えるべきです。 – user2407038
@ user2407038 GHCでは、少なくともIO Xは非常に異なる表現をしています(https://hackage.haskell.org/package/base-4.10.0.0/docs/src/GHC.Base.html#line- 1197)である。 –
に
foo :: (Int -> IO Int) -> IO Int
foo f = liftA2 (+) (f 0) (f 0)
を変更する前に、私たちはよく考えなければならないだろうはい、print
は純粋関数です。戻り値は、タイプIO()
です。これは、渡された文字列を出力する一連のコードと考えることができます。渡す文字列ごとに、常に同じコードが返されます。
- 1. 純粋な関数が純粋な意味を返すのは何ですか?
- 2. 非純粋関数と純粋関数の違いは何ですか?
- 3. 純粋なHaskellコードにはスレッドプールが必要ですか?
- 4. なぜnumCapabilitiesは純粋な関数ですか?
- 5. 以下はどのように純粋な関数ですか?
- 6. JavaScript ES6の純粋な関数
- 7. ハスケル、純粋な関数のメモ化が
- 8. Lua 5.2 - utf8 lower関数 - 純粋なLUA実装ですか?
- 9. 単純な入力関数Haskell
- 10. 純粋にSTM関数をテストする
- 11. は、CompoNetを純粋な関数としてここで
- 12. オプションで純粋な関数で副作用を呼び出す
- 13. Haskellで純粋な関数がどのように解決されるかの理解
- 14. JNIメソッドから純粋なC関数を呼び出す
- 15. 純粋な関数が「純粋でない」関数を呼び出した場合、GCCは警告/エラーを発行できますか?
- 16. 純粋なレデューサーとは何ですか?
- 17. 純粋なES2015関数で "setState"に反応する方法
- 18. 純粋なReactで非同期関数をチェインする?
- 19. Haskell:メモリブロックを効率的にモデル化する純粋なデータ構造ですか?
- 20. 純粋仮想関数のオーバーロード
- 21. 純粋仮想関数のエラー
- 22. Enterprise Architect純粋仮想関数 "= 0"
- 23. 次の再帰関数を純粋な関数にするには?
- 24. 純粋な関数内のIOアクションの意味は何ですか?
- 25. 純粋仮想関数でC++クラスを使用するには?
- 26. アクセス純粋な数字だけで
- 27. 純粋な仮想関数を「削除」する方法はありますか?
- 28. 純粋なアセンブリ - リンクされたC関数なし
- 29. 純粋な仮想関数のないC++抽象クラス?
- 30. jqueryを各関数を純粋なjavascriptに変換する
'print'は何を返しますか? –
組み込みの不純な関数にはすべて、その名前に 'unsafe'という単語があります。だから、 'print'は純粋です。同じパラメータで同じ結果が返されます。 – 4castle
@ 4castle必ずしもそうではありませんが、通常は「安全でない」とは、その関数が合計ではないということです。 – freestyle