Spec-Zone.ru › Haskell 7

Data.ByteString.Char8

Авторские права (c) Don Stewart 2006-2008 (c) Duncan Coutts 2006-2011
Лицензия BSD-стиль
Поддержка dons00@gmail.com, duncan@community.haskell.org
Стабильность стабильная
Переносимость переносимая
Безопасный Haskell Надежный
Язык Haskell98

Содержание

  • Тип ByteString
  • Введение и удаление ByteString
  • Базовый интерфейс
  • Преобразование ByteStrings
  • Уменьшение ByteString (свертки)
    • Специальные свертки
  • Создание ByteStrings
    • Сканирование
    • Накопление отображений
    • Генерация и развертывание ByteStrings
  • Подстроки
    • Разбиение строк
    • Разбиение на множество подстрок
    • Разбиение на строки и слова
  • Предикаты
    • Поиск произвольных подстрок
  • Поиск в ByteStrings
    • Поиск по равенству
    • Поиск с помощью предиката
  • Индексирование ByteStrings
  • Сжатие и распаковку ByteStrings
  • Отсортированные ByteStrings
  • Чтение из ByteStrings
  • Преобразования CString на низком уровне
    • Копирование ByteStrings
    • Упаковывание CStrings и указателей
    • Использование ByteStrings как CStrings
  • Ввод-вывод с помощью ByteString
    • Стандартный ввод и вывод
    • Файлы
    • Ввод-вывод с дескрипторами

Описание

Обработка ByteString с использованием Char операций. Все символы будут усечены до 8 бит. Можно ожидать, что эти функции будут работать с такой же скоростью, как и их Word8 аналоги в Data.ByteString.

Более конкретно, эти байтовые строки рассматриваются как подмножество Unicode, покрывающее кодовые точки от 0 до 255. Это охватывает Unicode Basic Latin, Latin-1 Supplement и управляющие символы C0+C1.

См.:

  • http://www.unicode.org/charts/
  • http://www.unicode.org/charts/PDF/U0000.pdf
  • http://www.unicode.org/charts/PDF/U0080.pdf

Этот модуль предназначен для импорта qualified, чтобы избежать конфликтов имён с функциями Prelude. Пример:

import qualified Data.ByteString.Char8 as C

Интерфейс Char8 для байтовых строк предоставляет экземпляр IsString для типа ByteString, позволяя использовать строковые литералы и неявно преобразовывать их в ByteStrings. Используйте {-# LANGUAGE OverloadedStrings #-} для активации этой возможности.

Тип ByteString

data ByteString Источник

Экономичное представление вектора Word8, поддерживающее множество эффективных операций.

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

Экземпляры

Eq ByteString
Data ByteString
Ord ByteString
Read ByteString
Show ByteString
IsString ByteString
Monoid ByteString
NFData ByteString

Введение и удаление ByteStrings

empty :: ByteString Источник

O(1) Пустая ByteString

singleton :: Символ -> ByteString Источник

O(1) Преобразование символа в ByteString

pack :: Строка -> ByteString Источник

O(n) Преобразование строки в ByteString

Для приложений с большим количеством строковых литералов, pack может быть узким местом.

unpack :: ByteString -> [Символ] Источник

O(n) Преобразование ByteString в список символов.

Базовый интерфейс

cons :: Символ -> ByteString -> ByteString infixr 5 Источник

O(n) Аналогично (:) для списков, но с другой сложностью, так как требуется memcpy.

snoc :: ByteString -> Символ -> ByteString infixl 5 Источник

O(n) Добавление символа в конец ByteString. Подобно cons, эта функция выполняет memcpy.

O(1) Извлеките элементы после начала ByteString, которая обязательно должна быть непустой. В случае пустого ByteString будет выброшено исключение.

init :: ByteString -> ByteString Source

O(1) Возвращает все элементы ByteString, кроме последнего. В случае пустого ByteString будет выброшено исключение.

null :: ByteString -> Bool Source

O(1) Проверка, является ли ByteString пустой.

length :: ByteString -> Int Source

O(1) length возвращает длину ByteString как Int.

Преобразование ByteString

map :: (Char -> Char) -> ByteString -> ByteString Source

O(n) map f xs — это ByteString, полученная путём применения f к каждому элементу xs.

reverse :: ByteString -> ByteString Source

O(n) reverse xs эффективно возвращает элементы xs в обратном порядке.

intersperse :: Char -> ByteString -> ByteString Source

O(n) Функция intersperse принимает Char и ByteString и «вставляет» этот Char между элементами ByteString. Аналогична функции intersperse для списков.

intercalate :: ByteString -> [ByteString] -> ByteString Source

O(n) Функция intercalate принимает ByteString и список ByteString и конкатенирует список после вставки первого аргумента между каждым элементом списка.

transpose :: [ByteString] -> [ByteString] Source

Функция transpose транспонирует строки и столбцы своего аргумента ByteString.

Уменьшение ByteString (сводки)

foldl :: (a -> Char -> a) -> a -> ByteString -> a Source

Функция foldl, применённая к бинарному оператору, начальному значению (обычно левой единице оператора) и ByteString, уменьшает ByteString, используя бинарный оператор слева направо.

foldl' :: (a -> Char -> a) -> a -> ByteString -> a Source

'foldl\'' — это foldl, но строгий по отношению к аккумулятору.

foldl1 :: (Char -> Char -> Char) -> ByteString -> Char Source

foldl1 — это вариант foldl, у которого нет аргумента начального значения, и поэтому он должен применяться к непустым ByteStrings.

foldl1' :: (Char -> Char -> Char) -> ByteString -> Char Source

Строгая версия foldl1

foldr :: (Char -> a -> a) -> a -> ByteString -> a Source

foldr, применённая к бинарному оператору, начальному значению (обычно правому единице оператора) и упакованной строке, уменьшает упакованную строку, используя бинарный оператор справа налево.

foldr' :: (Char -> a -> a) -> a -> ByteString -> a Source

'foldr\'' — это строгая версия foldr.

foldr1 :: (Char -> Char -> Char) -> ByteString -> Char Source

foldr1 — это вариант foldr, у которого нет аргумента начального значения, и поэтому он должен применяться к непустым ByteString.

foldr1' :: (Char -> Char -> Char) -> ByteString -> Char Source

Строгая версия foldr1

Специальные сводки

concat :: [ByteString] -> ByteString Source

O(n) Конкатенация списка ByteString.

concatMap :: (Char -> ByteString) -> ByteString -> ByteString Source

Применить функцию к ByteString и конкатенировать результаты.

any :: (Char -> Bool) -> ByteString -> Bool Source

Применённая к предикату и ByteString, any определяет, удовлетворяет ли какой-либо элемент ByteString предикату.

all :: (Char -> Bool) -> ByteString -> Bool Source

Применённая к предикату и ByteString, all определяет, удовлетворяют ли все элементы ByteString предикату.

maximum :: ByteString -> Char Source

maximum возвращает максимальное значение из ByteString.

minimum :: ByteString -> Char Source

minimum возвращает минимальное значение из ByteString

Создание ByteString

Сканирование

scanl :: (Char -> Char -> Char) -> Char -> ByteString -> ByteString Source

scanl аналогично foldl, но возвращает список последовательных уменьшенных значений слева:

scanl f z [x1, x2, ...] == [z, z `f` x1, (z `f` x1) `f` x2, ...]

Обратите внимание, что

last (scanl f z xs) == foldl f z xs.

scanl1 :: (Char -> Char -> Char) -> ByteString -> ByteString Source

scanl1 является вариантом scanl, не имеющим аргумента начального значения:

scanl1 f [x1, x2, ...] == [x1, x1 `f` x2, ...]

scanr :: (Char -> Char -> Char) -> Char -> ByteString -> ByteString Source

scanr — это дуальная функция scanl, работающая справа налево.

scanr1 :: (Char -> Char -> Char) -> ByteString -> ByteString Source

scanr1 является вариантом scanr, не имеющим аргумента начального значения.

Накопление отображений

mapAccumL :: (acc -> Char -> (acc, Char)) -> acc -> ByteString -> (acc, ByteString) Source

Функция mapAccumL работает как комбинация map и foldl; она применяет функцию к каждому элементу ByteString, передавая накопительный параметр слева направо, и возвращает конечное значение этого накопителя вместе с новым списком.

mapAccumR :: (acc -> Char -> (acc, Char)) -> acc -> ByteString -> (acc, ByteString) Source

Функция mapAccumR работает как комбинация map и foldr; она применяет функцию к каждому элементу ByteString, передавая накопительный параметр справа налево, и возвращает конечное значение этого накопителя вместе с новым ByteString.

Генерация и развертывание ByteStrings

replicate :: Int -> Char -> ByteString Source

O(n) replicate n x представляет собой ByteString длины n со значением x каждого элемента. Выполняется следующее:

replicate w c = unfoldr w (\u -> Just (u,u)) c

Эта реализация использует memset(3)

unfoldr :: (a -> Maybe (Char, a)) -> a -> ByteString Source

O(n), где n — длина результата. Функция unfoldr аналогична функции List 'unfoldr'. unfoldr строит ByteString из начального значения. Функция принимает элемент и возвращает Nothing если выполнено создание ByteString, или возвращает Just (a,b), в этом случае a является следующим символом в строке, а b — начальным значением для дальнейшего создания.

Примеры:

unfoldr (\x -> if x <= '9' then Just (x, succ x) else Nothing) '0' == "0123456789"

unfoldrN :: Int -> (a -> Maybe (Char, a)) -> a -> (ByteString, Maybe a) Source

O(n) Подобно unfoldr, unfoldrN строит ByteString из начального значения. Однако длина результата ограничена первым аргументом к unfoldrN. Эта функция более эффективна, чем unfoldr, когда максимальная длина результата известна.

Следующее уравнение связывает unfoldrN и unfoldr:

unfoldrN n f s == take n (unfoldr f s)

Подстроки

Разбиение строк

take :: Int -> ByteString -> ByteString Source

O(1) take n, применённая к ByteString xs, возвращает префикс xs длины n, или сам xs если n > length xs.

drop :: Int -> ByteString -> ByteString Source

O(1) drop n xs возвращает суффикс xs после первых n элементов, или сам [] если n > length xs.

splitAt :: Int -> ByteString -> (ByteString, ByteString) Source

O(1) splitAt n xs эквивалентно (take n xs, drop n xs).

takeWhile :: (Char -> Bool) -> ByteString -> ByteString Source

takeWhile, применённая к предикату p и ByteString xs, возвращает самый длинный префикс (возможно пустой) xs элементов, удовлетворяющих p.

dropWhile :: (Char -> Bool) -> ByteString -> ByteString Source

dropWhile p xs возвращает оставшийся суффикс после takeWhile p xs.

span :: (Char -> Bool) -> ByteString -> (ByteString, ByteString) Source

span p xs разбивает ByteString на два сегмента. Эквивалентно (takeWhile p xs, dropWhile p xs)

spanEnd :: (Char -> Bool) -> ByteString -> (ByteString, ByteString) Source

spanEnd ведет себя подобно span, но с конца ByteString. У нас есть

spanEnd (not.isSpace) "x y z" == ("x y ","z")

и

spanEnd (not . isSpace) ps
   == 
let (x,y) = span (not.isSpace) (reverse ps) in (reverse y, reverse x) 

break :: (Char -> Bool) -> ByteString -> (ByteString, ByteString) Source

break p эквивалентно span (not . p).

breakEnd :: (Char -> Bool) -> ByteString -> (ByteString, ByteString) Source

breakEnd ведет себя подобно break, но с конца ByteString

breakEnd p == spanEnd (not.p)

group :: ByteString -> [ByteString] Source

Функция group принимает ByteString и возвращает список ByteString, конкатенация которых равна аргументу. Более того, каждый подсписок в результате содержит только равные элементы. Например,

group "Mississippi" = ["M","i","ss","i","ss","i","pp","i"]

Это частный случай groupBy, который позволяет программисту указать собственное условие равенства. Она примерно на 40% быстрее, чем groupBy (==)

groupBy :: (Char -> Char -> Bool) -> ByteString -> [ByteString] Source

Функция groupBy — это неопределённая версия group.

inits :: ByteString -> [ByteString] Source

O(n) Возвращает все начальные сегменты данного ByteString, начиная с самого короткого.

tails :: ByteString -> [ByteString] Source

O(n) Возвращает все конечные сегменты данного ByteString, начиная с самого длинного.

Разбиение на несколько подстрок

split :: Char -> ByteString -> [ByteString] Source

O(n) Разбивает ByteString на части, разделённые байтовым аргументом, потребляя разделитель. Т.е.

split '\n' "a\nb\nd\ne" == ["a","b","d","e"]
split 'a'  "aXaXaXa"    == ["","X","X","X",""]
split 'x'  "x"          == ["",""]

и

intercalate [c] . split c == id
split == splitWith . (==)

Как и все функции разделения в этой библиотеке, эта функция не копирует подстроки, а лишь создаёт новые ByteStrings, которые являются фрагментами исходной.

splitWith :: (Char -> Bool) -> ByteString -> [ByteString] Source

O(n) Разделяет ByteString на компоненты, ограниченные разделителями, где предикат возвращает True для разделителя. Результирующие компоненты не содержат разделители. Два смежных разделителя приводят к пустому компоненту в выводе. например.

splitWith (=='a') "aabbaca" == ["","","bb","c",""]

Разбиение на строки и слова

lines :: ByteString -> [ByteString] Source

lines разбивает ByteString на список ByteString по символам новой строки. Результирующие строки не содержат символы новой строки.

words :: ByteString -> [ByteString] Source

words разбивает ByteString на список слов, ограниченные символами пробела.

unlines :: [ByteString] -> ByteString Source

unlines является обратной операцией к lines. Она объединяет строки, добавив завершающую новую строку к каждой.

unwords :: [ByteString] -> ByteString Source

Функция unwords аналогична функции unlines, но для слов.

Предикаты

isPrefixOf :: ByteString -> ByteString -> Bool Source

O(n) Функция isPrefixOf принимает две ByteString и возвращает True, если первая является префиксом второй.

isSuffixOf :: ByteString -> ByteString -> Bool Source

O(n) Функция isSuffixOf принимает две ByteString и возвращает True, если первая является суффиксом второй.

Следующее верно:

isSuffixOf x y == reverse x `isPrefixOf` reverse y

Однако, реальная реализация использует memcmp для сравнения только конца строки, без необходимости обратного порядка.

isInfixOf :: ByteString -> ByteString -> Bool Source

Проверяет, является ли одна строка подстрокой другой. isInfixOf p s эквивалентно not (null (findSubstrings p s)).

Поиск произвольных подстрок

breakSubstring Source

Аргументы

:: ByteString

Строка для поиска

-> ByteString

Строка для поиска в ней

-> (ByteString, ByteString)

Голова и хвост строки, разорванной по подстроке

Разбивает строку по подстроке, возвращая пару из части строки перед совпадением и остальной части строки.

Следующие соотношения выполняются:

break (== c) l == breakSubstring (singleton c) l

и:

findSubstring s l ==
   if null s then Just 0
             else case breakSubstring s l of
                      (x,y) | null y    -> Nothing
                            | otherwise -> Just (length x)

Например, для разбора строки, опуская разделители:

tokenise x y = h : if null t then [] else tokenise x (drop (length x) t)
    where (h,t) = breakSubstring x y

Для перехода к первому вхождению строки:

snd (breakSubstring x y) 

Для взятия частей строки перед разделителем:

fst (breakSubstring x y) 

findSubstring Source

Аргументы

:: ByteString

Строка для поиска.

-> ByteString

Строка, в которой нужно выполнить поиск.

-> Maybe Int

Устаревшее: findSubstring устарело и заменено на breakSubstring.

Получить первый индекс подстроки в другой строке или Nothing, если подстрока не найдена. findSubstring p s эквивалентно listToMaybe (findSubstrings p s).

findSubstrings Источник

Аргументы

:: ByteString

Строка для поиска.

-> ByteString

Строка, в которой нужно выполнить поиск.

-> [Int]

Устаревшее: findSubstrings устарело и заменено на breakSubstring.

Найти индексы всех (возможно перекрывающихся) вхождений подстроки в строке.

Поиск в ByteString

Поиск по равенству

elem :: Char -> ByteString -> Bool Источник

O(n) elem — это ByteString предикат членства. Эта реализация использует memchr(3).

notElem :: Char -> ByteString -> Bool Источник

O(n) notElem — это обратное elem

Поиск с помощью предиката

find :: (Char -> Bool) -> ByteString -> Maybe Char Источник

O(n) Функция find принимает предикат и ByteString и возвращает первый элемент, удовлетворяющий предикату, или Nothing, если такого элемента нет.

filter :: (Char -> Bool) -> ByteString -> ByteString Источник

O(n) filter, применённая к предикату и ByteString, возвращает ByteString, содержащую те символы, которые удовлетворяют предикату.

Индексация ByteString

index :: ByteString -> Int -> Char Источник

O(1) Оператор индекса (подстроки), начиная с 0.

elemIndex :: Char -> ByteString -> Maybe Int Источник

O(n) Функция elemIndex возвращает индекс первого элемента в заданном ByteString, который равен (по memchr) запрошенному элементу, или Nothing, если такого элемента нет.

elemIndices :: Char -> ByteString -> [Int] Источник

O(n) Функция elemIndices расширяет elemIndex, возвращая индексы всех элементов, равных запрошенному элементу, в возрастающем порядке.

elemIndexEnd :: Char -> ByteString -> Maybe Int Источник

O(n) Функция elemIndexEnd возвращает последний индекс элемента в заданном ByteString, который равен запрошенному элементу, или Nothing, если такого элемента нет. Выполняется:

elemIndexEnd c xs == 
(-) (length xs - 1) `fmap` elemIndex c (reverse xs)

findIndex :: (Char -> Bool) -> ByteString -> Maybe Int Источник

Функция findIndex принимает предикат и ByteString и возвращает индекс первого элемента в ByteString, удовлетворяющего предикату.

findIndices :: (Char -> Bool) -> ByteString -> [Int] Источник

Функция findIndices расширяет findIndex, возвращая индексы всех элементов, удовлетворяющих предикату, в возрастающем порядке.

count :: Char -> ByteString -> Int Источник

count возвращает количество раз, когда ее аргумент встречается в ByteString

count = length . elemIndices

Также

count '\n' == length . lines

Но более эффективно, чем использование length на промежуточном списке.

Сцепление и расцепление ByteString

zip :: ByteString -> ByteString -> [(Char, Char)] Источник

O(n) zip принимает две ByteString и возвращает список соответствующих пар символов. Если одна входная ByteString короткая, избыточные элементы более длинной ByteString отбрасываются. Это эквивалентно паре unpack операций, и поэтому использование памяти может быть большим для ByteString размером в несколько мегабайт

zipWith :: (Char -> Char -> a) -> ByteString -> ByteString -> [a] Источник

zipWith обобщает zip путём сцепления с помощью функции, заданной в качестве первого аргумента, вместо функции для создания кортежей. Например, zipWith (+) применяется к двум ByteString для получения списка соответствующих сумм.

unzip :: [(Char, Char)] -> (ByteString, ByteString) Источник

unzip преобразует список пар символов в пару ByteString. Обратите внимание, что это выполняет две pack операции.

Отсортированные ByteString

sort :: ByteString -> ByteString Источник

O(n) Эффективно сортирует ByteString, используя сортировку подсчётом.

Чтение из ByteString

readInt :: ByteString -> Maybe (Int, ByteString) Source

readInt считывает целое число Int из начала ByteString. Если в начале строки нет целого числа, возвращает Nothing, иначе возвращает прочитанное целое число и остаток строки.

readInteger :: ByteString -> Maybe (Integer, ByteString) Source

readInteger считывает целое число Integer из начала ByteString. Если в начале строки нет целого числа, возвращает Nothing, иначе возвращает прочитанное целое число и остаток строки.

Преобразования CString на низком уровне

Копирование ByteStrings

copy :: ByteString -> ByteString Source

O(n) Создаёт копию ByteString со своим хранилищем. Это полезно, чтобы позволить остальной части данных, на которые указывает ByteString, быть удалёнными сборщиком мусора, например, если была прочитана большая строка, а в остальной части программы нужна только её небольшая часть.

Упаковка CStrings и указателей

packCString :: CString -> IO ByteString Source

O(n). Создаёт новую ByteString из CString. Результирующая ByteString — это неизменяемая копия исходного CString, которая управляется на куче Haskell. Исходный CString должен быть завершён нулём.

packCStringLen :: CStringLen -> IO ByteString Source

O(n). Создаёт новую ByteString из CStringLen. Результирующая ByteString — это неизменяемая копия исходного CStringLen. ByteString — обычное значение Haskell и будет управляться на куче Haskell.

Использование ByteStrings в качестве CStrings

useAsCString :: ByteString -> (CString -> IO a) -> IO a Source

O(n) конструирование Использует ByteString с функцией, требующей нуль-терминированного CString. CString — это копия и будет освобождена автоматически.

useAsCStringLen :: ByteString -> (CStringLen -> IO a) -> IO a Source

O(n) конструирование Использует ByteString с функцией, требующей CStringLen. Как и в случае с useAsCString, эта функция создаёт копию исходного ByteString.

Ввод-вывод с ByteString

Ввод-вывод ByteString использует двоичный режим без декодирования символов или преобразования символов перевода строки. То, что он не учитывает режим перевода строки в файле, считается недостатком и может быть изменено в будущей версии.

Стандартный ввод и вывод

getLine :: IO ByteString Source

Считывает строку из стандартного ввода.

getContents :: IO ByteString Source

getContents. Чёткое считывание стандартного ввода. Эквивалентно hGetContents stdin. Файл Handle закрывается после чтения содержимого.

putStr :: ByteString -> IO () Source

Записывает ByteString в стандартный вывод

putStrLn :: ByteString -> IO () Source

Записывает ByteString в стандартный вывод, добавляя символ новой строки

interact :: (ByteString -> ByteString) -> IO () Source

Функция interact принимает функцию типа ByteString -> ByteString в качестве аргумента. Вся входная информация со стандартного устройства ввода передаётся в эту функцию в качестве аргумента, а результирующая строка выводится на стандартное устройство вывода.

Файлы

readFile :: FilePath -> IO ByteString Source

Чётко считывает весь файл в ByteString. Это гораздо эффективнее, чем считывание символов в String и последующее использование pack. Также может быть более эффективным, чем открытие файла и чтение с помощью hGet.

writeFile :: FilePath -> ByteString -> IO () Source

Записывает ByteString в файл.

appendFile :: FilePath -> ByteString -> IO () Source

Добавляет ByteString в файл.

Ввод-вывод с дескрипторами

hGetLine :: Handle -> IO ByteString Source

Считывает строку из дескриптора.

hGetContents :: Handle -> IO ByteString Source

Считывает всё содержимое дескриптора в ByteString. Функция считывает кусками, увеличивая размер куска при каждом считывании. Конечная строка затем перевыделяется до соответствующего размера. Для файлов, занимающих более половины доступной памяти, это может привести к исчерпанию памяти. В этом случае рассмотрите использование readFile. Дескриптор закрывается после чтения содержимого или если возникает исключение.

hGet :: Handle -> Int -> IO ByteString Source

Считывает ByteString напрямую из указанного Handle. Это гораздо эффективнее, чем чтение символов в String и последующее использование pack. Первый аргумент — дескриптор для чтения, а второй — количество байтов для чтения. Возвращает прочитанные байты, до n, или empty если достигнут конец файла.

hGet реализована через hGetBuf.

Если дескриптор — это труба или сокет, и конец записи закрыт, hGet будет вести себя так, как будто достигнут конец файла.

hGetSome :: Handle -> Int -> IO ByteString Source

Подобно hGet, за исключением того, что может быть возвращена более короткая ByteString, если немедленно доступно недостаточно байтов для удовлетворения всего запроса. hGetSome блокируется только в том случае, если нет доступных данных и EOF еще не достигнут.

hGetNonBlocking :: Handle -> Int -> IO ByteString Source

hGetNonBlocking аналогичен hGet, за исключением того, что он никогда не будет блокироваться, ожидая доступности данных, вместо этого он возвращает только доступные данные. Если нет доступных данных для чтения, hGetNonBlocking возвращает empty.

Примечание: в Windows и с реализацией Haskell, отличной от GHC, эта функция работает неправильно; она ведет себя идентично hGet.

hPut :: Handle -> ByteString -> IO () Source

Выводит ByteString в указанный Handle.

hPutNonBlocking :: Handle -> ByteString -> IO ByteString Source

Аналогично hPut, за исключением того, что он никогда не будет блокироваться. Вместо этого он возвращает любой хвост, который не был записан. Этот хвост может быть empty в случае, если вся строка была записана, или вся исходная строка, если ничего не было записано. Возможны и частичные записи.

Примечание: в Windows и с реализацией Haskell, отличной от GHC, эта функция работает неправильно; она ведет себя идентично hPut.

hPutStr :: Handle -> ByteString -> IO () Source

Синоним для hPut, для совместимости

hPutStrLn :: Handle -> ByteString -> IO () Source

Запись ByteString в дескриптор файла, добавляя байт новой строки

© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/7.10.3/docs/html/libraries/bytestring-0.10.6.0/Data-ByteString-Char8.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API