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