7

私はunsafePerformIO最近読んでいます、そして私はあなたに何かを聞きたいです。unsafePerformIO実際の言語は外部環境と相互作用できるはずなので、ある程度正当化されるという事実で私は大丈夫です。

ただし、私の知る限りでは、呼び出しを検索する際にコードを検査せずに、明らかに純粋な(タイプから判断して)インターフェイス/ライブラリが本当に純粋であるかどうかをすばやく知る方法を知りませんunsafePerformIO(ドキュメントでは言及してください)。参照透過性が保証されていることが確実な場合にのみ使用する必要があることは承知していますが、それでも知りたいと思います。

4

2 に答える 2

10

ソースコードをチェックせずにはいられません。しかし、それはそれほど難しいことではありません。Haddockは、ドキュメント内の構文で強調表示された定義への優れたリンクを直接提供しているからです。例については、このページの定義の右側にある「ソース」リンクを参照してください。

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

于 2012-04-04T22:40:11.037 に答える
5

あなたが考えている場合、の使用unsafePerformIOは不当です。のドキュメントはこれを説明しています。これは、実装者がunsafePerformIO参照透過性を破る方法がないこと、つまり「純粋関数型」セマンティクスを証明できる場合にのみ使用されます。つまり、純粋に関数型プログラムがそれを検出できる方法で誰かが使用unsafePerformIOする場合(たとえば、結果が引数以外に依存する関数を作成する場合)、それは許可されていない使用法です。

このようなケースに遭遇した場合、最も可能性が高いのは、バグを発見したことです。

于 2012-04-04T22:41:44.553 に答える