Spec-Zone.ru › Haskell 9

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] Исходный код

Контекст (a ~ Char) был добавлен в 4.9.0.0

С версии: 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

Spec-Zone.ru

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