我想要的东西,这看起来像一个文件处理,但是真正支持一个缓冲存储器使用的I/O重定向。我怎么可以这样做?

有帮助吗?

解决方案

这是不可能的,而无需修改编译器。这是因为处理是一个抽象的数据类型,不一typeclass.

其他提示

我只写了一个图书馆提供了这一点,称为"旋钮"[hackage].你可以用它来创建 Handles其基准/修改 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将成为可见的存储器映部分。

这实际上是一个错误的图书馆设计,和一个懊恼我,也是。我看到两种方法可以做你想要什么,无论其中是非常有吸引力。

  1. 创建一个新的typeclass,让目前处理的一个实例,编写另一个实例,要做到在内存数据的事情,改变所有程序,需要使用这种设施。可能这很简单,因为进口 System.SIO (或者任何你想要的称呼的话),而不是的 System.IO.但是如果您使用的定义I/O程在图书馆等 Data.ByteString, 有更多的工作要做。

  2. 重写I/O图书馆延长他们支持这一点。不是微不足道的,并有很多工作,但它不是特别困难的工作要做。然而,那么你已经有了一个系统的兼容性问题与不具有这个图书馆。

添加一个现代化的这个问题的答案,可以使用 createPipeSystem.Process:

createPipe :: IO (Handle, Handle)

https://www.stackage.org/haddock/lts-10.3/process-1.6.1.0/System-Process.html#v:createPipe

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top