2013-08-08 7 views
13

ハスケルハンドルを使用するときに少し不安を感じました。つまり、私は2つの機能を探しています(おそらく彼らはすでにそこにいて、その場合、私の無知を許してください)。私は(例えば、Network.acceptによって返された) が読み書き可能の両方である、私は のペアに変換したいのハンドルを取得しましたハスケルの安全な取り扱いですか?

  1. 読み取り専用と書き込み専用読み取り専用の ハンドルへの書き込みは型チェックを行わず、逆も同様です。 (おそらく1ファントムタイプを使用して これを達成し、IO機能をラップすることができますか?)
  2. 同時設定では、私は複数のスレッドは非常に厄介な結果を生じさせる同じハンドルに書き込むすることが可能であることがわかりました。どのようにして型システム(可能であれば)を介してそれを防止するか、または実行時に例外をスローしてそのようなケースを通知するにはどうすればよいでしょうか?

ご了承ください。

答えて

2

network conduitパッケージを使用することをおすすめします。

type Application m = AppData m -> m() 

data AppData m Source -- ... 
appSource :: AppData m -> Source m ByteStringSource 
appSink :: AppData m -> Sink ByteString m() 

これはきれいに書き込み、読み出し部分を分離:1つのシンクがソケットにデータをプッシュし、ソケットからデータを読み込み、一つのソース - それは2つの「エンドポイント」が与えられているものとして、ネットワークアプリケーションを記述しています。このようなソースとシンクで好きなことをすることができます。それぞれを別のスレッドに渡し、入力と出力を別々に処理することもできます。もちろん、それぞれのエンドポイントに応じて読み書きしかできません。

シングルスレッド処理を実行する場合は、プログラムコンポーネントをConduit ByteString m ByteStringとして実装するように制限することができます。このような導管はaseily

asApp :: MonadIO m => Conduit ByteString m ByteString -> Application m 
asApp cond ad = appSource ad $= cond $$ appSink ad 

ようApplication秒に変換することができます。しかし導管は唯一awaitを使用してデータを要求し、yieldを使用して出力を書き込むことができ、それ以外のハンドルのいずれかの種類にアクセスする何を持っていないし、決してそのエンドポイントのいずれかを見てしたがって、どこにでもそれらを公開したり漏らすことはできません。

8

あなたが望むのはsafer-file-handlesライブラリのようです。最初の部分はかなり明確に扱われます。並行処理の安全性は、regionsライブラリのRegionTによって処理されるように見えます。私はこれをまったく使用していませんが、かなり一般的なアプローチのようです。

関連する問題