Hvordan oppretter jeg en in-memory håndtak i Haskell?

stemmer
13

Jeg vil ha noe som ser ut som en fil håndtak, men er virkelig støttet av en in-memory buffer for å bruke for I / O omdirigeringer. Hvordan kan jeg gjøre dette?

Publisert på 13/09/2008 klokken 12:30
kilden bruker
På andre språk...                            


6 svar

stemmer
1

Dette kan ikke være mulig. GHC , minst, ser ut til å kreve et håndtak å ha et OS filbeskrivere som brukes for alle lese / skrive / søke operasjoner.

Se /libraries/base/IOBase.lhsfra GHC kilder.

Du kan være i stand til å få samme effekt ved å verve OS hjelp: opprette en midlertidig fil, kobler håndtaket til det og deretter minne kartlegge filen for I / O omdirigeringer. På denne måten, alt i håndtaket I / O vil bli synlig i minnetilordnede delen.

Svarte 15/09/2008 kl. 16:02
kilden bruker

stemmer
-1

Det er ikke mulig uten å endre kompilatoren. Dette er fordi håndtaket er en abstrakt datatype, ikke en typeclass.

Svarte 15/09/2008 kl. 19:44
kilden bruker

stemmer
3

Hvis du kan uttrykke hva du ønsker å gjøre i form av C eller systemkall kan du bruke Haskell utenriks Funksjon Interface (FFI). Jeg begynte å foreslå å bruke mmap, men på andre tenkte jeg tror mmap kan være en kartlegging på feil måte, selv om du brukte den med den anonyme alternativet.

Du finner mer informasjon om Haskell FFI på haskell.org wiki.

Svarte 15/09/2008 kl. 22:54
kilden bruker

stemmer
1

Dette er faktisk en feil i biblioteket design, og en som er irritert meg også. Jeg ser to tilnærminger til å gjøre hva du vil, verken som er veldig attraktiv.

  1. Opprett en ny typeclass, gjøre gjeldende håndtaket en forekomst av det, skriver en annen instans til å gjøre det i minnet-data ting, og endre alle dine programmer som trenger å bruke denne funksjonen. Muligens dette er så enkelt som å importere System.SIO(eller hva du vil kalle det) i stedet for System.IO. Men hvis du bruker den egendefinerte I / O-rutiner i bibliotekene som Data.ByteString, det er mer arbeid som må gjøres der.

  2. Omskrive I / O-bibliotek for å utvide dem til å støtte dette. Ikke trivielt, og mye arbeid, men det ville ikke være spesielt vanskelig arbeid å gjøre. Men så har du et kompatibilitetsproblem med systemer som ikke har dette biblioteket.

Svarte 26/06/2009 kl. 01:50
kilden bruker

stemmer
19

Jeg skrev et bibliotek som gir dette, kalt "knott" [ hackage ]. Du kan bruke den til å lage Handles som referanse / endre en 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)
Svarte 08/10/2011 kl. 23:23
kilden bruker

stemmer
0

For å legge til et moderne svar på dette spørsmålet, kan du bruke createPipefra System.Process:

createPipe :: IO (Handle, Handle)

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

Svarte 10/01/2018 kl. 13:41
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more