3

foo :: String -> IO StringWeb サービスにリクエストを送信し、データをダウンロードして解析し、文字列を返す関数があるとします。同じリクエスト文字列が与えられた場合、Web サービスは常に同じ文字列を返すことを私は知っています。これは、「安全に」使用unsafePerformIOし、決して問題を引き起こさないことを知るのに十分な情報ですか? それとも、他のことも確認する必要がありますか?

編集:これを検討している理由はdeduce :: (String -> String) -> String、入力関数をパラメーターとして受け取り、さまざまなパラメーターで評価することによって関数のいくつかのプロパティを推測する関数があるためです。ここで、この Web サービスのいくつかのプロパティを推測したいと思いますが、型シグネチャを変更するなど、大幅に変更unsafePerformIOする必要があります。これは、プロパティを推測する他のすべての関数も変更する必要があることを意味します。deducededuce :: (String -> IO String) -> String

4

1 に答える 1

11

そうしないでください。unsafePerformIO外部プリミティブをバインドし、データ構造の深いハックを行い、時にはトップレベルの変更可能な状態を確立するためのものです。

安全に聞こえますが、これは悪い考えです。予期していなかったときに魔法のように接続が発生するため、リソースの使用状況などの点で、プログラムの残りの部分を推論するのが難しくなります.

人々が指摘したように、サービスが実際に常に同じ文字列を返すのであれば、テンプレート Haskell を使用してコンパイル時に一度だけリクエストを作成する方が安全で効率的です。

編集:わかりました、問題がわかりました。ただし、推測したい他の関数の型を変更する必要はありません。

の型が の場合、fいつString -> Stringでも を取得できますreturn . f :: String -> IO String。したがって、他の関数を台無しにしないでください。単に return で構成してください。これで、効果的なコードと純粋なコードの両方を同じように簡単に処理できます..

于 2013-06-28T16:00:59.387 に答える