2012-05-16 2 views
18

Ich möchte wie so ByteString, um Wörter zu spalten:Haskell Wie Char zu Word8 konvertieren

import qualified Data.ByteString as BS 

main = do 
    input <- BS.getLine 
    let xs = BS.split ' ' input 

Aber es scheint, dass GHC kann kein Zeichenliteral zu Word8 selbst konvertieren, so dass ich:

Couldn't match expected type `GHC.Word.Word8' 
      with actual type `Char' 
In the first argument of `BS.split', namely ' ' 
In the expression: BS.split ' ' input 

Hoogle findet nichts mit Typ Unterschrift von Char -> Word8 und Word.Word8 ' ' ist ungültiger Typ Konstruktor. Irgendwelche Ideen, wie man es beheben kann?

+4

Verwenden 'nicht ByteString' für Text! Verwenden Sie stattdessen ['Text'] (http://hackage.haskell.org/package/text). –

+0

@DanielWagner Warum nicht? Ist es schneller als "ByteString"? – Andrew

+5

'Text' ist Unicode-freundlich, so dass Ihre Strings in allen Ländern Strings sind. 'ByteString' ist für binäres Parsing, Rohspeicherzugriff und kann nichts anderes als ascii oder latin1 handhaben. –

Antwort

31

Das Data.ByteString.Char8 Modul ermöglicht es Ihnen Word8 Werte in den bytestrings als Char zu behandeln.

nur
import qualified Data.ByteString.Char8 as C 

dann siehe z.B. C.split. Es ist die gleiche Bytestring unter der Haube, aber die Char-orientierte Funktionen sind für bequeme Byte/Ascii Parsing zur Verfügung gestellt.

+0

Danke! Das war's. – Andrew

17

Falls Sie wirklich brauchen Data.ByteString (nicht Data.ByteString.Char8), könnten Sie tun, was Data.ByteString sich zwischen Word8 zu konvertieren tut Char:

import qualified Data.ByteString as BS 
import qualified Data.ByteString.Internal as BS (c2w, w2c) 

main = do 
    input <- BS.getLine 
    let xs = BS.split (BS.c2w ' ') input 
    return()