2008-09-13 18 views
13

Quiero algo que se asemeje a un manejador de archivo, pero realmente está respaldado por un búfer en memoria para usar en redireccionamientos de E/S. ¿Cómo puedo hacer esto?¿Cómo creo un identificador en memoria en Haskell?

+0

usted Puede que quiera volver a esta pregunta, hay una nueva respuesta que debería ver. –

+0

@ Peter Mortensen Parece que la respuesta de John es exactamente lo que quiere. – PyRulez

Respuesta

0

No es posible sin modificar el compilador. Esto se debe a que Handle es un tipo de datos abstracto, no una clase de tipos.

+0

Gracias por todas las respuestas. Realmente solo quería saber si había una forma idiomática de Haskell para hacer esto que yo no sabía, por lo que esta respuesta me demanda. – airportyh

1

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

Ver /libraries/base/IOBase.lhs de las fuentes de GHC.

Puede obtener el mismo efecto al solicitar la ayuda del sistema operativo: cree un archivo temporal, conecte el controlador y luego la asignación de memoria del archivo para los redireccionamientos de E/S. De esta manera, todas las E/S del controlador se volverán visibles en la sección asignada de la memoria.

3

Si puede expresar lo que quiere hacer en términos de C o un sistema de llamadas que puede usar interfaz para funciones de Asuntos Exteriores de Haskell (FFI). Empecé a sugerir el uso de mmap, pero pensándolo bien, creo que mmap podría ser un mapeo incorrecto, incluso si lo usaste con la opción anónima.

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

1

Esto es en realidad un error en el diseño de la biblioteca, y uno que me ha molestado, también. Veo dos enfoques para hacer lo que quieres, ninguno de los cuales es terriblemente atractivo.

  1. Crear una nueva clase de tipos, hacen que el mango actual una instancia de ella, escribir otro ejemplo de hacer las cosas en la memoria de datos, y cambiar todos los programas que necesitan utilizar este servicio. Posiblemente esto es tan simple como importar System.SIO (o lo que quieras llamar) en lugar de System.IO. Pero si utiliza las rutinas de E/S personalizadas en bibliotecas como Data.ByteString, aún queda trabajo por hacer.

  2. reescribir las bibliotecas de E/S para extenderlos para apoyar esto. No es trivial, y mucho trabajo, pero no sería un trabajo particularmente difícil de hacer. Sin embargo, entonces tiene un problema de compatibilidad con los sistemas que no tienen esta biblioteca.

19

acabo de escribieron una biblioteca que proporciona esta, llamada "perilla" [hackage]. Se puede utilizar para crear Handle s que se hace 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) 
Cuestiones relacionadas