Haskell Language
data.text
Поиск…
замечания
Text
является более эффективной альтернативой стандартным String
типам Haskell. String
определяется как связанный список символов в стандартной прелюдии в отчете Haskell :
type String = [Char]
Text
представлен как упакованный массив символов Юникода. Это похоже на то, как большинство других языков высокого уровня представляют строки, и дает гораздо лучшую эффективность времени и пространства, чем версия списка.
Text
должен быть предпочтительнее для String
для всех видов использования. Заметное исключение зависит от библиотеки, которая имеет String
API, но даже в этом случае может быть полезно использовать Text
внутри и преобразовать в String
непосредственно перед взаимодействием с библиотекой.
Во всех примерах в этом разделе используется расширение языка OverloadedStrings
.
Текстовые литералы
Расширение языка OverloadedStrings
позволяет использовать обычные строковые литералы для обозначения значений Text
.
{-# LANGUAGE OverloadedStrings #-}
import qualified Data.Text as T
myText :: T.Text
myText = "overloaded"
Удаление пробелов
{-# LANGUAGE OverloadedStrings #-}
import qualified Data.Text as T
myText :: T.Text
myText = "\n\r\t leading and trailing whitespace \t\r\n"
strip
удаляет пробелы с начала и конца значения Text
.
ghci> T.strip myText
"leading and trailing whitespace"
stripStart
удаляет пробелы только с самого начала.
ghci> T.stripStart myText
"leading and trailing whitespace \t\r\n"
stripEnd
удаляет пробелы только с конца.
ghci> T.stripEnd myText
"\n\r\t leading and trailing whitespace"
filter
можно использовать для удаления пробелов или других символов с середины.
ghci> T.filter /=' ' "spaces in the middle of a text string"
"spacesinthemiddleofatextstring"
Разделение текстовых значений
{-# LANGUAGE OverloadedStrings #-}
import qualified Data.Text as T
myText :: T.Text
myText = "mississippi"
splitOn
разбивает Text
на список Texts
на вхождения подстроки.
ghci> T.splitOn "ss" myText
["mi","i","ippi"]
splitOn
является инверсным для intercalate
.
ghci> intercalate "ss" (splitOn "ss" "mississippi")
"mississippi"
split
разбивает Text
значение на куски на символы, которые удовлетворяют булевому предикату.
ghci> T.split (== 'i') myText
["m","ss","ss","pp",""]
Текст кодирования и декодирования
Функции кодирования и декодирования для различных кодировок Unicode можно найти в модуле Data.Text.Encoding
.
ghci> import Data.Text.Encoding
ghci> decodeUtf8 (encodeUtf8 "my text")
"my text"
Обратите внимание, что decodeUtf8
будет генерировать исключение из недопустимого ввода. Если вы хотите обрабатывать недействительный UTF-8 самостоятельно, используйте decodeUtf8With
.
ghci> decodeUtf8With (\errorDescription input -> Nothing) messyOutsideData
Проверка того, является ли текст подстрокой другого текста
ghci> :set -XOverloadedStrings
ghci> import Data.Text as T
isInfixOf :: Text -> Text -> Bool
проверяет, содержится ли Text
в любом другом Text
.
ghci> "rum" `T.isInfixOf` "crumble"
True
isPrefixOf :: Text -> Text -> Bool
проверяет, появляется ли Text
в начале другого Text
.
ghci> "crumb" `T.isPrefixOf` "crumble"
True
isSuffixOf :: Text -> Text -> Bool
проверяет, появляется ли Text
в конце другого Text
.
ghci> "rumble" `T.isSuffixOf` "crumble"
True
Текст индексирования
{-# LANGUAGE OverloadedStrings #-}
import qualified Data.Text as T
myText :: T.Text
myText = "mississippi"
Символы в определенных индексах могут быть возвращены функцией index
.
ghci> T.index myText 2
's'
Функция findIndex
выполняет функцию типа (Char -> Bool)
и Text и возвращает индекс первого вхождения данной строки или Nothing, если она не встречается.
ghci> T.findIndex ('s'==) myText
Just 2
ghci> T.findIndex ('c'==) myText
Nothing
Функция count
возвращает количество раз, когда Text
запроса встречается в другом Text
.
ghci> count ("miss"::T.Text) myText
1