Data.String
| Авторские права | (c) Университет Глазго 2007 |
|---|---|
| Лицензия | BSD-стиль (см. файл libraries/base/LICENSE) |
| Поддержка | libraries@haskell.org |
| Устойчивость | стабильная |
| Переносимость | переносимая |
| Safe Haskell | Безопасный |
| Язык | Haskell2010 |
Содержание
Описание
Тип String и связанные операции.
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 ПРОБЕЛ).
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.12.1/docs/libraries/base-4.21.0.0-8e62/Data-String.html