题
我想要的东西,这看起来像一个文件处理,但是真正支持一个缓冲存储器使用的I/O重定向。我怎么可以这样做?
解决方案
这是不可能的,而无需修改编译器。这是因为处理是一个抽象的数据类型,不一typeclass.
其他提示
我只写了一个图书馆提供了这一点,称为"旋钮"[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)
如果你可以表达你想要做什么在C或系统的电话你可以用Haskell的外交职能的接口(FFI).我开始建议使用mmap,但第二个想法我想mmap可能的映射了错误的方式,甚至如果你用它的匿名的选择。
你可以找到更多的信息,Haskell FFI在haskell.org wiki。
这可能是不可能的。 GHC, 至少,似乎需要处理具有操作系统的文件描述符用于所有读写/寻求操作。
看看 /libraries/base/IOBase.lhs
从全康的来源。
你可能能够获得同样的效果通过登记的操作系统的帮助:创建一个临时文件,连接处理它,然后存储地图的文件,为I/O重定向。这种方法,所有处理I/O将成为可见的存储器映部分。
这实际上是一个错误的图书馆设计,和一个懊恼我,也是。我看到两种方法可以做你想要什么,无论其中是非常有吸引力。
创建一个新的typeclass,让目前处理的一个实例,编写另一个实例,要做到在内存数据的事情,改变所有程序,需要使用这种设施。可能这很简单,因为进口
System.SIO
(或者任何你想要的称呼的话),而不是的System.IO
.但是如果您使用的定义I/O程在图书馆等Data.ByteString
, 有更多的工作要做。重写I/O图书馆延长他们支持这一点。不是微不足道的,并有很多工作,但它不是特别困难的工作要做。然而,那么你已经有了一个系统的兼容性问题与不具有这个图书馆。
添加一个现代化的这个问题的答案,可以使用 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