我想要的东西看起来像一个文件句柄,但真正支持内存缓冲区以用于I/O重定向。我怎样才能做到这一点?如何在Haskell中创建内存中的句柄?
回答
不修改编译器是不可能的。这是因为Handle是一个抽象数据类型,而不是一个类型类型。
这可能是不可能的。至少,GHC似乎需要一个句柄才能拥有用于所有读/写/查找操作的OS文件描述符。
查看来自GHC源的/libraries/base/IOBase.lhs
。
您可以通过获得操作系统的帮助来获得相同的效果:创建一个临时文件,将句柄连接到它,然后为I/O重定向映射文件。这样,所有的句柄I/O都将在内存映射部分中可见。
如果你可以用C或系统调用表达你想要做的事情,你可以使用Haskell的外部函数接口(FFI)。我开始建议使用mmap,但是第二个想法是我认为即使您使用匿名选项,mmap也可能是错误的映射。
您可以在haskell.org wiki上找到关于Haskell FFI的更多信息。
这实际上是图书馆设计中的一个错误,也是令我烦恼的一个错误。我看到两种方法可以做你想做的事,而这两种方法都不是非常有吸引力。
创建一个新的类型类,使当前处理它的一个实例,写另一个实例做内存数据的事情,并改变所有的程序需要使用此功能的。可能这与输入
System.SIO
(或任何你想称之的)而不是System.IO
一样简单。但是,如果您在库中使用自定义I/O例程(例如Data.ByteString
),那么需要完成更多工作。重写I/O库以扩展它们以支持此操作。不是微不足道的,还有很多工作,但这不是特别困难的工作。然而,那么你对没有这个库的系统有兼容性问题。
我刚刚写了一个图书馆,提供了这个,称为“旋钮”[hackage]。您可以使用它来创建Handle
S的引用/修改ByteString
:
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)
到了现代的回答到这个问题,你可以使用createPipe
从System.Process
:
createPipe :: IO (Handle, Handle)
https://www.stackage.org/haddock/lts-10.3/process-1.6.1.0/System-Process.html#v:createPipe
- 1. jsonServiceClient中的内存(句柄)泄漏
- 2. 如何在C++中创建全局句柄 - CLI
- 3. 如何在内存中创建文件句柄并将其传递给Python中的外部命令
- 4. Haskell并发性和句柄
- 5. 如何在Haskell中创建运算符?
- 6. 如何在haskell中创建线程?
- 7. Matlab - 如何检查句柄的存在
- 8. 如何使用在内存中创建
- 9. perl:在内存中的文件句柄sysread?
- 10. 在句柄中删除动态创建的列表js
- 11. 在内存中创建
- 12. 内存地址C的整数句柄#
- 13. 创建类属性的句柄
- 14. 如何在java中释放句柄
- 15. 如何从curl句柄中删除CURL_FILE句柄?
- 16. 如何判断句柄对象在matlab中使用多少内存
- 17. 如何在if语句中的条件内创建宏
- 18. 如何在Perl类中存储和访问文件句柄?
- 19. 如何在存储过程的SELECT语句中创建“假”行
- 20. 位图和句柄内存泄漏
- 21. 如何在.NET中创建内存中的HTML/XML文档?
- 22. 如何在ruby中的内存中创建zip文件?
- 23. 操作系统如何创建唯一的文件句柄?
- 24. 如何创建陈旧的NFS文件句柄?
- 25. 如何深入了解创建句柄的代码
- 26. Haskell中的句柄是半关闭错误?
- 27. 如何处理C++/CLI中的句柄?
- 28. 获取句柄以动态创建swfloader
- 29. 错误创建窗口句柄
- 30. 无法创建cudnn句柄:CUDNN_STATUS_INTERNAL_ERROR
你可能想重新回顾这个问题,你应该看到一个新的答案。 – 2011-10-10 20:07:12
@Peter Mortensen看来约翰的答案正是你想要的。 – PyRulez 2015-03-31 21:18:02