Haskell Как преобразовать Char в Word8

Я хочу разбить ByteString на такие слова:

import qualified Data.ByteString as BS

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

Но похоже, что GHC не может преобразовать символьный литерал в Word8 сам по себе, поэтому я получил:

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 не находит ничего с сигнатурой типа Char -> Word8, а Word.Word8 ' ' является недопустимым конструктором типа. Любые идеи о том, как это исправить?


person Andrew    schedule 16.05.2012    source источник
comment
Не используйте ByteString для текста! Вместо этого используйте Text.   -  person Daniel Wagner    schedule 16.05.2012
comment
@DanielWagner Почему бы и нет? Это быстрее, чем ByteString?   -  person Andrew    schedule 17.05.2012
comment
Text поддерживает Unicode, поэтому ваши строки будут строками во всех странах. ByteString предназначен для бинарного синтаксического анализа, прямого доступа к памяти и не может обрабатывать ничего, кроме ascii или latin1.   -  person Don Stewart    schedule 17.05.2012
comment
Интересно, спасибо. Это было для задачи конкурса программирования, поэтому диапазон возможных кодировок ограничен ascii.   -  person Andrew    schedule 17.05.2012


Ответы (4)



Если вам действительно нужен Data.ByteString (не Data.ByteString.Char8), вы можете сделать то, что делает сам Data.ByteString для преобразования Word8 в 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 ()
person grwlf    schedule 19.03.2013

Люди ищут простой Char -> Word8 с базовой библиотекой:

import Data.Word

charToWord8 :: Char -> Word8
charToWord8 = toEnum . fromEnum
person Hussein AIT LAHCEN    schedule 03.02.2019
comment
я понятия не имею, мой друг - person Hussein AIT LAHCEN; 11.03.2019

Я хочу напрямую обратиться к вопросу в строке темы, которая привела меня сюда в первую очередь.

Вы можете преобразовать один Char в один Word8 с помощью fromIntegral.ord:

λ> import qualified Data.ByteString as BS
λ> import Data.Char(ord)

λ> BS.split (fromIntegral.ord $ 'd') $ BS.pack . map (fromIntegral.ord) $ "abcdef"

["abc","ef"]

Имейте в виду, что это преобразование будет склонно к переполнению, как показано ниже.Вы должны убедиться, что ваше Char соответствует 8 битам. , если вы не хотите, чтобы это произошло.

λ> 260 :: Word8

4

Конечно, для вашей конкретной проблемы предпочтительнее использовать Data.ByteString.Char8, как уже указано в принятом ответе.

person oo_miguel    schedule 09.03.2019