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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow