2012-04-04 8 views
7

最近、私はunsafePerformIOについて読んでいます。何かお聞きしたいと思います。実際の言語が外部環境とやりとりできなければならないので、私は大丈夫です。だからunsafePerformIOはいくらか正当です。明らかに純粋なHaskellインターフェイスが安全でない操作を隠すときを知る方法?

しかし、私の知る限りでは、明らかに純粋な(型から判断すると)インタフェース/ライブラリが実際に純粋であるかどうかを知るための迅速な方法は認識していません。unsafePerformIO (ドキュメンテーションはそれを言及するために省略することができる)。 参照透過性が保証されていると確信している場合にのみ使用するべきですが、それについては知りたいと思います。

+3

「参照透過性が保証されていると確信している場合にのみ使用する必要があることはわかっています。 Inは、内部操作が合理的な方法で外部に漏れない場合、つまり、そのようなものがフードの下で行われていることを伝える方法がない場合にのみ使用する必要があります。 – leftaroundabout

+1

ところで、 'unsafePerformIO'を使って外部環境とやりとりすることは、まったくできないことです。すべてのエフェクトは、コードの内部にあると考えられています。つまり、シーンの背後に可変変数を使用してメモを実装するようなものです。 – ehird

+0

@ehird:詳しい説明はありがたいですが、私が「環境」と書いたとき、私はそれを外部の(非ハズケル)ライブラリも含むもっと広い意味で意味しました。私はユーザーのやり取りについては考えなかった。 –

答えて

10

ソースコードを確認する方法はありません。しかし、それはあまりにも難しくありません.Haddockはドキュメント内の構文強調表示された定義に直接リンクしています。例については、this pageの定義の右側にある「Source」リンクを参照してください。

Safe Haskellはここで関連します。安全でない機能の使用を禁止したい場合に、Haskellコードをコンパイルするために使用されます。モジュールが安全でないモジュール(System.IO.Unsafeなど)を使用していて、特にTrustworthyとマークされていない場合、そのモジュールは安全でない状態を継承します。しかし、unsafePerformIOを使用するモジュールは一般的にそれを安全に使用するため、自分自身をTrustworthyと宣言します。

+0

ありがとう、だから私は思った通りです...ソースコードか何も。まあ、少なくとも、プログラマによって再び保証されていますが、Safe Haskellは安全でないモジュールを自動的に識別するのに役立ちます。 –

5

あなたが考えている場合、unsafePerformIOの使用は正当ではありません。 documentation for unsafePerformIOはこれを説明しています。これは、実装者がの参照用透明度を破る方法がないことを証明できる場合、つまり「純粋に機能的」な意味を意味します。すなわち、誰かが純粋に機能的なプログラムがそれを検出できるように(例えば、その結果がその引数よりも多くに依存する関数を書くなど)、unsafePerformIOを使用すると、それは許可されない使用です。

このようなケースに遭遇した場合は、おそらくバグが見つかった可能性があります。

+2

質問から:「参照透過性が保証されていると確信しているときにのみ使用するべきであることは分かっていますが、それにも関わらず知りたいと思います。 – ehird

+0

@sacundium:あなたはそうです、私はすでに 'unsafePerformIO'のドキュメントページを見ましたが、それは単なるルールであり、プログラマが実際に参照透過性の証拠を持っているとは確信できません:) –