如何在Haskell中创建内存中的句柄?

时间:2020-03-05 18:52:43  来源:igfitidea点击:

我想要看起来像文件句柄但确实有内存缓冲区支持的I / O重定向对象。我怎样才能做到这一点?

解决方案

回答

这可能是不可能的。至少,GHC似乎要求句柄具有用于所有读取/写入/查找操作的OS文件描述符。

请参阅来自GHC来源的/ libraries / base / IOBase.lhs

我们可以通过使用操作系统的帮助来获得相同的效果:创建一个临时文件,将其连接到该句柄,然后为该I / O重定向内存映射该文件。这样,所有句柄I / O都将在内存映射部分中变得可见。

回答

不修改编译器是不可能的。这是因为Handle是抽象数据类型,而不是类型类。

回答

如果我们可以用C或者系统调用表达我们想做什么,则可以使用Haskell的外函数接口(FFI)。我开始建议使用mmap,但第二个想法是,即使我们将其与匿名选项一起使用,我也认为mmap可能是错误的映射方式。

我们可以在haskell.org Wiki上找到有关Haskell FFI的更多信息。

回答

这实际上是库设计中的一个错误,也让我很烦。我看到两种方法可以做自己想做的事,但都不是很吸引人。

  • 创建一个新的类型类,使当前类处理它的一个实例,编写另一个实例来执行内存数据操作,并更改需要使用此功能的所有程序。可能这就像导入System.SIO(或者任何我们想调用的名称)而不是System.IO一样简单。但是,如果我们在诸如" Data.ByteString"之类的库中使用自定义I / O例程,则还有更多工作要做。
  • 重写I / O库以扩展它们以支持此功能。这并非微不足道,并且需要大量工作,但是要做起来并不是特别困难。但是,那么我们将遇到没有此库的系统的兼容性问题。