2016-05-09 10 views
4

In meinem Haskell Programm muss ich mit Streichern und ByteStrings arbeiten:String -> ByteString und Reverse

import Data.ByteString.Lazy as BS (ByteString) 
import Data.ByteString.Char8 as C8 (pack) 
import Data.Char     (chr) 

stringToBS :: String -> ByteString 
stringToBS str = C8.pack str 

bsToString :: BS.ByteString -> String 
bsToString bs = map (chr . fromEnum) . BS.unpack $ bs 

bsToString funktioniert gut, aber stringToBS Ergebnisse mit folgenden Fehler bei der Zusammenstellung:

Couldn't match expected type ‘ByteString’ 
       with actual type ‘Data.ByteString.Internal.ByteString’ 
    NB: ‘ByteString’ is defined in ‘Data.ByteString.Lazy.Internal’ 
     ‘Data.ByteString.Internal.ByteString’ 
      is defined in ‘Data.ByteString.Internal’ 
    In the expression: pack str 
    In an equation for ‘stringToBS’: stringToBS str = pack str 

Aber Ich muss es ByteString von Data.ByteString.Lazy as BS (ByteString) für weitere Arbeitsfunktionen in meinem Code sein lassen.

Irgendeine Idee, wie man mein Problem löst?

+0

BTW, ich hoffe, Sie wissen, was Sie tun. Ein 'ByteString' ist eine Folge von Bytes und kein String: Die Konvertierung zwischen ihnen hängt im Wesentlichen von einer gegebenen Kodierung ab. Insbesondere geht 'Char8' davon aus, dass alles mit latin-1 codiert ist, und kürzt alles stillschweigend ab. – chi

+1

Gibt es einen besonderen Grund, warum Sie 'String' und nicht' Text' verwenden, ist die Konvertierung mit der Kodierung/Dekodierung etwas einfacher. – epsilonhalbe

+0

Da meine anderen Funktionen erfordert String –

Antwort

1

Sie können zwischen Lazy und Non-Lazy Versionen mit fromStrict und toStrict konvertieren (beide Funktionen befinden sich im Lazy-Byte-String-Modul).

+0

'urlDecode True (stringToBS str)' mit 'stringToBS str = BS.fromStrict $ C8.pack str 'bringt mich:' Konnte nicht erwarteten Typ' Data.ByteString.Internal.ByteString ' mit dem tatsächlichen Typ 'ByteString', wie zu lösen? –

3

Sie arbeiten mit beiden strengen ByteStrings und faul ByteStrings, die zwei verschiedene Typen sind.

Dieser Import:

import Data.ByteString.Lazy as BS (ByteString) 

macht ByteString die faulen ByteStrings beziehen, so ist die Art Signatur Ihrer stringToBS nicht Definition entsprechen:

stringToBS :: String -> ByteString -- refers to lazy ByteStrings 
stringToBS str = C8.pack str  -- refers to strict ByteStrings 

ich denke, es eine bessere Idee wäre, zu verwenden import qualified wie folgt:

import qualified Data.ByteString.Lazy as LBS 
import qualified Data.ByteString.Char8 as BS 

und verwenden Sie BS.ByteString und LBS.ByteString, um auf strict/faul ByteStrings zu verweisen.