2012-01-23 9 views
11

Chcę napisać prostą funkcję, która dzieli ByteString na przy użyciu jako ogranicznika. Moja próba:Haskell Jak utworzyć Word8?

import Data.ByteString 

listize :: ByteString -> [ByteString] 
listize xs = Data.ByteString.splitWith (=='\n') xs 

ten generuje błąd, ponieważ '\n' jest Char zamiast Word8, która jest co Data.ByteString.splitWith spodziewa.

Jak zmienić tę prostą postać w Word8, z którą będzie odtwarzana ByteString?

Odpowiedz

14

mógłby po prostu użyć numeryczny dosłowne 10, ale jeśli chcesz przekonwertować znaki liter można użyć fromIntegral (ord '\n') (the fromIntegral jest wymagane do konwersji Int że ord powraca do Word8). Będziesz musiał zaimportować Data.Char dla ord.

Można również importować Data.ByteString.Char8, która oferuje funkcje do korzystania Char zamiast Word8 na tym samym typie ByteString danych. (Rzeczywiście, ma lines funkcję, która robi dokładnie to, co chcesz). Jest to jednak generalnie nie zalecane, ponieważ ByteString s NIE sklepowych codepoints Unicode (co jest co Char reprezentuje), ale zamiast surowych oktety (czyli Word8 s).

Jeśli przetwarzasz dane tekstowe, powinieneś rozważyć użycie Text zamiast ByteString.

+0

Och, wow. Doskonały. Będę musiał przekopać się w reprezentacjach postaci, jak sądzę. Nie mam pojęcia, co to są literały liczbowe dla postaci. Czy jest gdzieś ich lista? –

+0

Piszę program, który będzie analizować pliki bazy danych białek, które zawierają ciągi znaków, liczby całkowite i liczby podwójne. Łańcuchy będą najczęściej używane do identyfikacji właściwych pozycji z listy, podczas gdy int i debel będą używane w operacjach matematycznych. Nie jestem pewien, jakiej klasy powinienem użyć w tym celu. –

+1

Możesz użyć 'ord' w GHCi, aby znaleźć numery kodowe znaków :) Generalnie otrzymuję dane Unicode z [fileformat.info] (http://www.fileformat.info/info/unicode/index.htm); blok [Basic Latin] (http://www.fileformat.info/info/unicode/block/basic_latin/index.htm) zawiera 128 współrzędnych kodowych odziedziczonych z ASCII. – ehird