Pregunta

Quiero algo que se parece a un identificador de archivo, sino que está respaldado por una memoria búfer para el uso de I/O redirecciones.¿Cómo puedo hacer esto?

¿Fue útil?

Solución

No es posible sin modificar el compilador.Esto es debido a que el Mango es un tipo de datos abstracto, no un typeclass.

Otros consejos

Acabo de escribir una biblioteca que proporciona este, llamado "mando" [hackage].Usted puede utilizarlo para crear Handles referencia/modificar un 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)

Si usted puede expresar lo que desea hacer en términos de C o llamadas al sistema se podría utilizar Haskell Exteriores de la Función de Interfaz (FFI).Empecé a sugerir el uso de mmap, pero pensándolo bien creo que mmap podría ser una cartografía del mal camino, incluso si se utiliza con la opción anónima.

Usted puede encontrar más información acerca de la Haskell FFI en el haskell.org wiki.

Esto puede no ser posible. GHC, al menos, parece requerir un identificador para tener un sistema operativo descriptor de archivo que se utiliza para todos los de lectura/escritura de las operaciones de búsqueda.

Ver /libraries/base/IOBase.lhs desde el GHC fuentes.

Usted puede ser capaz de obtener el mismo efecto, incorporando OS ayudan:crear un archivo temporal, conecte el mango y, a continuación, el mapa de memoria el archivo para el I/O redirecciones.De esta manera, todo el asa I/O sería visible en la memoria de la sección asignada.

Esto es realmente un error en el diseño de la biblioteca, y uno que me molesta, demasiado.Veo dos enfoques para hacer lo que quieras, ninguno de los cuales es terriblemente atractivo.

  1. Crear un nuevo typeclass, hacer que la corriente de manejar una instancia de ella, escribir otra instancia para hacer la en-memoria-datos de la cosa, y cambiar todos los programas que necesita para utilizar este servicio.Posiblemente esto es tan sencillo como importar System.SIO (o lo que sea que quieras llamarlo) en lugar de System.IO.Pero si el uso de la costumbre rutinas de e/S en las bibliotecas, tales como Data.ByteString, hay más trabajo que hacer allí.

  2. La reescritura de la e/S de las bibliotecas de las extienden para apoyar esto.No es trivial, y un montón de trabajo, pero no sería particularmente difícil trabajo que hacer.Sin embargo, entonces usted tiene un problema de compatibilidad con sistemas que no cuentan con esta biblioteca.

Para agregar un moderno respuesta a esta pregunta, usted podría utilizar createPipe de System.Process:

createPipe :: IO (Handle, Handle)

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top