私はファイルハンドルのように見えるが、実際にはI/Oリダイレクトに使用するメモリ内バッファがある。これどうやってするの?Haskellでメモリ内ハンドルを作成するにはどうすればよいですか?
答えて
コンパイラを変更しないとできません。これは、ハンドルが抽象データ型であり、型クラスではないためです。
すべての答えをありがとう。私は実際に私が知りませんでしたこれを行う慣用のハスケルの方法があるかどうかを知りたかったので、この答えは私を訴えます。 – airportyh
これは可能でない場合があります。 GHCは、少なくとも、すべての読み取り/書き込み/シーク操作に使用されるOSファイル記述子を持つハンドルを必要とするようです。
GHCソースから/libraries/base/IOBase.lhs
を参照してください。
OSのヘルプを登録することで、同じ効果が得られる場合があります。一時ファイルを作成し、そのファイルにハンドルを接続し、I/Oリダイレクトのファイルをメモリマップします。このようにして、すべてのハンドルI/Oがメモリーマップセクションに表示されます。
あなたがCまたはシステムコールに関して何をしたいかを表現できるなら、HaskellのFFI(Foreign Function Interface)を使うことができます。私はmmapの使用を提案しましたが、2番目の考えでは、匿名のオプションで使用したとしても、mmapが誤ったマッピングになるかもしれないと思います。
ハスケルFFIの詳細については、haskell.org wikiを参照してください。
これは実際にはライブラリデザインのバグであり、私にとっても迷惑なものです。私はあなたがしたいことをするために2つのアプローチを見ていますが、どちらもひどく魅力的ではありません。
新しい型クラスを作成し、現在はそのインスタンスを扱う作る、インメモリ・データのことを行うために別のインスタンスを作成して、この機能を使用する必要があり、あなたのすべてのプログラムを変更します。これは
System.IO
の代わりにSystem.SIO
(またはそれを呼び出したいもの)をインポートするのと同じくらい簡単です。しかし、Data.ByteString
などのライブラリでカスタムI/Oルーチンを使用すると、そこで実行する必要があります。I/Oライブラリを拡張してサポートするように書き換えます。自明ではなく、多くの作業がありますが、特に困難な作業ではありません。しかし、このライブラリを持たないシステムとの互換性の問題があります。
これを提供するライブラリを「ノブ」[hackage]と書いたばかりです。あなたはSystem.Process
からcreatePipe
を使用することができ、
import Data.ByteString (pack)
import Data.Knob
import System.IO
main = do
knob <- newKnob (pack [])
h <- newFileHandle knob "test.txt" WriteMode
hPutStrLn h "Hello world!"
hClose h
bytes <- Data.Knob.getContents knob
putStrLn ("Wrote bytes: " ++ show bytes)
この質問への現代的な答えを追加するには:あなたは、参照/ ByteString
を変更Handle
Sを作成するために使用することができ
createPipe :: IO (Handle, Handle)
https://www.stackage.org/haddock/lts-10.3/process-1.6.1.0/System-Process.html#v:createPipe
- 1. Eclipseでメモリ内のワークスペースまたはフォルダを作成するにはどうすればよいですか?
- 2. メモリ内ファイルからPILイメージを作成するにはどうすればよいですか?
- 3. メモリ内のsqliteデータベースを作成するにはどうすればよいですか?
- 4. alex/haskellでpythonスタイルのインデント/デントントトークンを作成するにはどうすればよいですか?
- 5. HaskellでData.Vector.Unboxedインスタンスを作成するにはどうすればよいですか?
- 6. Haskellで演算子を作成するにはどうすればよいですか?
- 7. haskell/gtk2hsでグラフィカルコマンドラインを作るにはどうすればいいですか?
- 8. ループ内で関数を作成しないようにするにはどうすればよいですか?
- 9. HaskellのリストからLaTeXファイルを作成するにはどうすればよいですか?
- 10. 関数を返すHaskell関数を作成するにはどうすればよいですか?
- 11. デスクトップウィンドウのハンドルを取得するにはどうすればよいですか?
- 12. フォーク後または子プロセスで共有メモリを作成するにはどうすればよいですか?
- 13. データベースを内部メモリから外部メモリに移動するにはどうすればよいですか?
- 14. メモリからファイルを読み込むIEditorInputを作成するにはどうすればよいですか?
- 15. ウェブサービスアプリの作成にはどうすればよいですか?
- 16. ハンドル作成時にどのように壊れますか?
- 17. js.Array内のjs.ArrayをscalaJS内に作成するにはどうすればよいでしょうか?
- 18. xcodeでテンプレートサブクラスファイルを作成するにはどうすればよいですか?
- 19. Muleでダイナミックインバウンドエンドポイントを作成するにはどうすればよいですか?
- 20. WPFでアダプティブレイアウトを作成するにはどうすればよいですか?
- 21. マウスオーバーでハイライトを作成するにはどうすればよいですか?
- 22. GCDでシングルトンシリアルキューを作成するにはどうすればよいですか?
- 23. app.configでカスタムセクションを作成するにはどうすればよいですか?
- 24. MenuItemImageをテキストで作成するにはどうすればよいですか?
- 25. FireMonkeyでトレイアイコンを作成するにはどうすればよいですか?
- 26. Magentoでクイックアクセスメニューを作成するにはどうすればよいですか?
- 27. ウェブブラウザでオートフィルフォームを作成するにはどうすればよいですか?
- 28. ARSKViewでポーズメニューを作成するにはどうすればよいですか?
- 29. Pythonでループを作成するにはどうすればよいですか?
- 30. OpenLayersでラウンドアイコンイメージを作成するにはどうすればよいですか?
にあなたはこの質問に再訪したい場合は、新しい回答があります。 –
@Peter Mortensenそれは、Johnの答えがまさにあなたが望むものだと思われます。 – PyRulez