Data.String
| Авторские права | (c) The University of Glasgow 2007 |
|---|---|
| Лицензия | В стиле BSD (см. файл libraries/base/LICENSE) |
| Сопровождающий | libraries@haskell.org |
| Стабильность | стабильный |
| Переносимость | переносимый |
| Безопасный Haskell | Безопасный |
| Язык | Haskell2010 |
Содержание
Описание
Тип String и связанные с ним операции.
type String = [Char] Исходный код
String — это псевдоним для списка символов.
Строковые константы в Haskell — это значения типа String. Это означает, что если написать строковый литерал, например "hello world", он будет иметь тип [Char], который совпадает с String.
Примечание: Можно попросить компилятор автоматически выводить другие типы с помощью языкового расширения -XOverloadedStrings, например "hello world" :: Text. Дополнительную информацию см. в IsString.
Поскольку String — это просто список символов, для базовой обработки строк можно использовать обычные функции для работы со списками. Операции над списками см. в Data.List.
Соображения о производительности
[Char] — относительно неэффективный с точки зрения использования памяти тип. Это связный список упакованных символов размером со слово; внутри он выглядит примерно так:
╭─────┬───┬──╮ ╭─────┬───┬──╮ ╭─────┬───┬──╮ ╭────╮
│ (:) │ │ ─┼─>│ (:) │ │ ─┼─>│ (:) │ │ ─┼─>│ [] │
╰─────┴─┼─┴──╯ ╰─────┴─┼─┴──╯ ╰─────┴─┼─┴──╯ ╰────╯
v v v
'a' 'b' 'c'
String "abc" будет занимать в памяти 5*3+1 = 16 (в общем случае 5n+1) слов.
Кроме того, такие операции, как (++) (конкатенация строк), имеют сложность O(n) (по левому аргументу).
По историческим причинам библиотека base во многих местах использует String ради концептуальной простоты, но в коде библиотек, работающем с пользовательскими данными, следует использовать пакет text для текста в Unicode или пакет bytestring для двоичных данных.
class IsString a where Исходный код
IsString используется вместе с языковым расширением -XOverloadedStrings для преобразования литералов в строки разных типов.
Например, если используется пакет text, можно написать
{-# LANGUAGE OverloadedStrings #-}
myText = "hello world" :: Text
Внутри расширение преобразует это в эквивалент
myText = fromString @Text ("hello world" :: String)
Примечание: fromString также можно использовать в обычном коде, однако к String применимы обычные проблемы с производительностью и эффективностью использования памяти.
Методы
fromString :: String -> a Исходный код
Экземпляры
| IsString a => IsString (Identity a) Исходный код | С версии: base-4.9.0.0 |
Определён в GHC.Internal.Data.String МетодыfromString :: String -> Identity a Исходный код | |
| a ~ Char => IsString [a] Исходный код |
Контекст С версии: base-2.1 |
Определён в GHC.Internal.Data.String МетодыfromString :: String -> [a] Исходный код | |
| IsString a => IsString (Const a b) Исходный код | С версии: base-4.9.0.0 |
Определён в GHC.Internal.Data.String МетодыfromString :: String -> Const a b Исходный код | |
Функции для работы со строками
lines :: String -> [String] Исходный код
Разбивает аргумент на список строк, удаляя завершающие символы \n. Для последней непустой строки аргумента завершающий символ \n необязателен.
Если строка-аргумент пуста или заканчивается символом \n, её можно восстановить, передав результат lines функции unlines. В противном случае unlines добавляет отсутствующий завершающий \n. Благодаря этому unlines . lines является идемпотентной:
(unlines . lines) . (unlines . lines) = (unlines . lines)
Примеры
>>> lines "" -- empty input contains no lines []
>>> lines "\n" -- single empty line [""]
>>> lines "one" -- single unterminated line ["one"]
>>> lines "one\n" -- single non-empty line ["one"]
>>> lines "one\n\n" -- second line is empty ["one",""]
>>> lines "one\ntwo" -- second line is unterminated ["one","two"]
>>> lines "one\ntwo\n" -- two non-empty lines ["one","two"]
words :: String -> [String] Исходный код
words разбивает строку на список слов, разделённых пробельными символами (согласно определению isSpace). Эта функция удаляет пробельные символы в начале и в конце.
Примеры
>>> words "Lorem ipsum\ndolor" ["Lorem","ipsum","dolor"]
>>> words " foo bar " ["foo","bar"]
unlines :: [String] -> String Исходный код
Добавляет символ \n к каждой входной строке, а затем объединяет результаты. Эквивалентно foldMap (s -> s ++ "\n").
Примеры
>>> unlines ["Hello", "World", "!"] "Hello\nWorld\n!\n"
Обратите внимание, что unlines . lines /= id, если входные данные не оканчиваются на \n:
>>> unlines . lines $ "foo\nbar" "foo\nbar\n"
unwords :: [String] -> String Исходный код
unwords объединяет слова, разделяя их пробелами (U+0020 SPACE).
unwords не является ни левым, ни правым обратным преобразованием для words:
>>> words (unwords [" "]) [] >>> unwords (words "foo\nbar") "foo bar"
Примеры
>>> unwords ["Lorem", "ipsum", "dolor"] "Lorem ipsum dolor"
>>> unwords ["foo", "bar", "", "baz"] "foo bar baz"
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/9.14.1/docs/libraries/base-4.22.0.0-66f8/Data-String.html