Haskell Language
Data.Tekst
Szukaj…
Uwagi
Text
jest bardziej wydajną alternatywą dla standardowego typu String
Haskell. String
jest zdefiniowany jako połączona lista znaków w standardowym Preludium, zgodnie z Raportem Haskella :
type String = [Char]
Text
jest reprezentowany jako spakowana tablica znaków Unicode. Jest to podobne do tego, jak większość innych języków wysokiego poziomu reprezentuje ciągi, i zapewnia znacznie lepszy czas i oszczędność miejsca niż wersja listy.
Text
powinien być preferowany String
ciągu String
do wszystkich zastosowań produkcyjnych. Godny uwagi wyjątek zależy od biblioteki, która ma String
API, ale nawet w takim przypadku może być korzyść z wewnętrznego użycia Text
i konwersji na String
tuż przed połączeniem z biblioteką.
Wszystkie przykłady w tym temacie używają rozszerzenia języka OverloadedStrings
.
Literały tekstowe
Rozszerzenie języka OverloadedStrings
pozwala na użycie normalnych literałów łańcuchowych zamiast wartości Text
.
{-# LANGUAGE OverloadedStrings #-}
import qualified Data.Text as T
myText :: T.Text
myText = "overloaded"
Usuwanie białych znaków
{-# LANGUAGE OverloadedStrings #-}
import qualified Data.Text as T
myText :: T.Text
myText = "\n\r\t leading and trailing whitespace \t\r\n"
strip
usuwa białe znaki z początku i końca wartości Text
.
ghci> T.strip myText
"leading and trailing whitespace"
stripStart
usuwa białe znaki tylko od początku.
ghci> T.stripStart myText
"leading and trailing whitespace \t\r\n"
stripEnd
usuwa białe znaki tylko z końca.
ghci> T.stripEnd myText
"\n\r\t leading and trailing whitespace"
filter
może być używany do usuwania białych znaków lub innych znaków ze środka.
ghci> T.filter /=' ' "spaces in the middle of a text string"
"spacesinthemiddleofatextstring"
Podział wartości tekstowych
{-# LANGUAGE OverloadedStrings #-}
import qualified Data.Text as T
myText :: T.Text
myText = "mississippi"
splitOn
dzieli Text
na listę Texts
w przypadku wystąpienia podłańcucha.
ghci> T.splitOn "ss" myText
["mi","i","ippi"]
splitOn
jest odwrotnością intercalate
.
ghci> intercalate "ss" (splitOn "ss" "mississippi")
"mississippi"
split
dzieli wartość Text
na części na znakach spełniających predykat logiczny.
ghci> T.split (== 'i') myText
["m","ss","ss","pp",""]
Kodowanie i dekodowanie tekstu
Funkcje kodowania i dekodowania różnych kodowań Unicode można znaleźć w module Data.Text.Encoding
.
ghci> import Data.Text.Encoding
ghci> decodeUtf8 (encodeUtf8 "my text")
"my text"
Zauważ, że decodeUtf8
zgłosi wyjątek na niepoprawne dane wejściowe. Jeśli chcesz samodzielnie obsłużyć nieprawidłowy UTF-8, użyj decodeUtf8With
.
ghci> decodeUtf8With (\errorDescription input -> Nothing) messyOutsideData
Sprawdzanie, czy tekst jest podciągiem innego tekstu
ghci> :set -XOverloadedStrings
ghci> import Data.Text as T
isInfixOf :: Text -> Text -> Bool
sprawdza, czy Text
jest zawarty w jakimkolwiek innym Text
.
ghci> "rum" `T.isInfixOf` "crumble"
True
isPrefixOf :: Text -> Text -> Bool
sprawdza, czy Text
pojawia się na początku innego Text
.
ghci> "crumb" `T.isPrefixOf` "crumble"
True
isSuffixOf :: Text -> Text -> Bool
sprawdza, czy Text
pojawia się na końcu innego Text
.
ghci> "rumble" `T.isSuffixOf` "crumble"
True
Indeksowanie tekstu
{-# LANGUAGE OverloadedStrings #-}
import qualified Data.Text as T
myText :: T.Text
myText = "mississippi"
Znaki o określonych indeksach mogą być zwracane przez funkcję index
.
ghci> T.index myText 2
's'
Funkcja findIndex
przyjmuje funkcję typu (Char -> Bool)
i Text i zwraca indeks pierwszego wystąpienia danego ciągu lub Nic, jeśli nie występuje.
ghci> T.findIndex ('s'==) myText
Just 2
ghci> T.findIndex ('c'==) myText
Nothing
Funkcja count
zwraca liczbę wystąpień Text
zapytania w innym Text
.
ghci> count ("miss"::T.Text) myText
1