Spec-Zone.ru › Haskell 9

Data.String

Авторские права (c) Университет Глазго 2007
Лицензия BSD-стиль (см. файл libraries/base/LICENSE)
Поддержка libraries@haskell.org
Устойчивость стабильная
Переносимость переносимая
Safe 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 ПРОБЕЛ).

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

Spec-Zone.ru

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