2012-01-23 27 views
11

ByteString'u [ByteString] ürününü ayırıcı olarak '\n' kullanarak ayıran basit bir işlev yazmak istiyorum. Benim girişimi: '\n' bir Char yerine bir Word8 daha olduğu için bu bir hata atarHaskell Nasıl Word8 Oluşturulur?

import Data.ByteString 

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

, beklediği Data.ByteString.splitWith olduğunu.

Bu basit karakteri, ByteString ile oynayacağı Word8'a nasıl dönüştürebilirim?

cevap

14

sadece 10 sayısal hazır kullanmak, ancak karakteri dönüştürmek istiyorsanız (fromIntegral bir Word8 içine Intord getiriyi dönüştürmek için gereklidir) fromIntegral (ord '\n') kullanabilirsiniz literal başladı. ord için Data.Char'u içe aktarmanız gerekecek.

Aynı ByteString veri türünde Word8 yerine Char işlevlerini kullanma işlevleri sunan Data.ByteString.Char8 da alabilirsiniz. (Char temsil budur) ByteString s yapamaz mağaza Unicode codepoints olarak, Ancak, bu genellikle önerilmez olan (Gerçekten de. Tam olarak ne istediğinizi yapan lines işlevi vardır) ancak bunun yerine ham sekizliyi (yani Word8 s).

Metin verilerini işliyorsanız, ByteString yerine Text kullanmayı düşünmelisiniz.

+0

Oh, vay. Mükemmel. Karakter sunumlarına girmeliyim, sanırım. Karakterlerin nümerik edebi şeyleri hakkında hiçbir fikrim yok. Onlarda bir yerlerin bir listesi var mı? –

+0

Dizeleri, tam sayıları ve çiftleri içeren protein veritabanı dosyalarını ayrıştıracak bir program yazıyorum. Dizeler çoğunlukla bir listeden doğru öğeleri tanımlamak için kullanılacaktır, oysa matematiksel işlemler için ints ve doubles kullanılacaktır. Bunun için hangi sınıfı kullanmam gerektiğinden emin değilim. –

+1

Karakterlerin kod noktası sayılarını bulmak için GHCi'de 'ord' kullanabilirsiniz. Genellikle [fileformat.info] 'dan Unicode verileri alırım (http://www.fileformat.info/info/unicode/index.htm); [Temel Latince] (http://www.fileformat.info/info/unicode/block/basic_latin/index.htm) bloğu, ASCII'den alınan 128 kod noktasını içerir. – ehird