read putstrln print file-io haskell io

file io - putstrln - ¿Cómo creo un control en memoria en Haskell?



putstrln haskell (5)

Quiero algo que se parezca 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?


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

  1. Cree una nueva clase de letra, convierta al controlador actual en una instancia de la misma, escriba otra instancia para hacer lo de datos en memoria y cambie todos los programas que necesiten utilizar esta instalación. Posiblemente esto es tan simple como importar System.SIO (o lo que quieras llamar) en lugar de System.IO . Pero si usa las rutinas de E / S personalizadas en bibliotecas como Data.ByteString , allí hay más trabajo por hacer.

  2. Reescriba las bibliotecas de E / S para ampliarlas y admitir 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.


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

Consulta /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 haga un mapa de la memoria del archivo para los redireccionamientos de E / S. De esta forma, todas las E / S del controlador se volverán visibles en la sección asignada de la memoria.


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


Si puede expresar lo que quiere hacer en términos de C o llamadas al sistema, puede usar la Interfaz de Función Extranjera (FFI) de Haskell. 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 sobre Haskell FFI en la wiki de haskell.org.


Acabo de escribir una biblioteca que proporciona esto, llamado "knob" [ hackage ]. Puede usarlo para crear Handle s que hace referencia / modifica una 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)