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?
Respuesta
No es posible sin modificar el compilador. Esto se debe a que Handle es un tipo de datos abstracto, no una clase de tipos.
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
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.
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.
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.
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 deSystem.IO
. Pero si utiliza las rutinas de E/S personalizadas en bibliotecas comoData.ByteString
, aún queda trabajo por hacer.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.
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)
Para añadir una respuesta moderna a esta pregunta, se puede usar 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
- 1. ¿Cómo creo un operador en Haskell?
- 2. Comportamiento de memoria desconcertante en Haskell
- 3. ¿Cómo creo una base de datos en memoria sqllite3?
- 4. Haskell - Comprobación de la validez de un identificador de archivo
- 5. Haskell gestión de memoria en IOS 5
- 6. Cadenas de memoria eficiente en Haskell
- 7. En Java, ¿cómo creo un archivo temporal solo en memoria para analizar xml?
- 8. ¿Cómo se hace una función de memoria genérica en Haskell?
- 9. Almacenamiento en memoria caché en Haskell y paralelismo explícito
- 10. ¿Cómo creo un temporizador en WPF?
- 11. ¿Cómo creo un índice DESC en MySQL?
- 12. Cómo creo un json en clojurescript
- 13. ¿Cómo creo un VirtualHost en Zend Server?
- 14. En SQLAlchemy, ¿cómo creo un par único?
- 15. ¿Cómo creo un elemento canvas en Dart?
- 16. ¿Cómo creo un MessageBox en C#?
- 17. ¿Cómo creo un hash SHA1 en ruby?
- 18. ¿Cómo creo un campo oculto en MVC3?
- 19. ¿Cómo creo un servicio web en IronPython?
- 20. ¿Cómo creo un archivo vacío en emacs?
- 21. WaitForSingleObject en un identificador de archivo?
- 22. Abrir un identificador a un dispositivo en Python en Windows
- 23. Generando un identificador global único en Java
- 24. ¿Cómo creo un decorador de memorando delimitado en Python?
- 25. Escribir un intérprete Haskell en Haskell
- 26. ¿Cómo creo un grupo de subprocesos?
- 27. ¿Cómo obtener un valor de puntero en Haskell?
- 28. ¿Cómo creo un clasificador de haar personalizado?
- 29. ¿Cómo creo "deshacer" en C++?
- 30. Haskell "donde" sangría: ¿por qué debe ser indentado pasado identificador?
usted Puede que quiera volver a esta pregunta, hay una nueva respuesta que debería ver. –
@ Peter Mortensen Parece que la respuesta de John es exactamente lo que quiere. – PyRulez