Sök…


Anmärkningar

Heltalsbokstäver

är en siffra utan decimal

till exempel 0 , 1 , 42 , ...

tillämpas implicit på fromInteger som är en del av klassen Num typ så den har verkligen typen Num a => a - det vill säga den kan ha vilken typ som helst som är en instans av Num


Fraktionella bokstäver

är en siffra med en decimal

till exempel 0.0 , -0.1111 , ...

tillämpas implicit på fromRational som är en del av Fractional så den har verkligen typ a => a - det vill fromRational att den kan ha vilken typ som helst som är en instans av Fractional


String Literals

Om du lägger till språkförlängningen OverloadedStrings till GHC kan du ha samma för String litteraler som sedan tillämpas på fromString från klassen Data.String.IsString

Detta används ofta för att ersätta String med Text eller ByteString .


Lista bokstäver

Listor kan definieras med [1, 2, 3] bokstavssyntax. I GHC 7.8 och senare kan detta också användas för att definiera andra listliknande strukturer med förlängningen OverloadedLists .

Som standard är typen av [] :

> :t []
[] :: [t]

Med OverloadedLists listor blir detta:

[] :: GHC.Exts.IsList l => l

Heltalsnummer

Typen av det bokstavliga

Prelude> :t 1
1 :: Num a => a

välja en konkret typ med kommentarer

Du kan ange typen så länge måltypen är Num med en kommentar :

Prelude> 1 :: Int
1
it :: Int
Prelude> 1 :: Double
1.0
it :: Double
Prelude> 1 :: Word
1
it :: Word

om inte kommer kompilatorn att klaga

Förspel> 1 :: String

<interactive>:
    No instance for (Num String) arising from the literal `1'
    In the expression: 1 :: String
    In an equation for `it': it = 1 :: String

Flytande siffror

Typen av det bokstavliga

Prelude> :t 1.0
1.0 :: Fractional a => a

Att välja en konkret typ med anteckningar

Du kan ange typen med en typanteckning . Det enda kravet är att typen måste ha en Fractional instans.

Prelude> 1.0 :: Double
1.0
it :: Double
Prelude> 1.0 :: Data.Ratio.Ratio Int
1 % 1
it :: GHC.Real.Ratio Int 

om inte kommer kompilatorn att klaga

Prelude> 1.0 :: Int
<interactive>:
    No instance for (Fractional Int) arising from the literal `1.0'
    In the expression: 1.0 :: Int
    In an equation for `it': it = 1.0 :: Int

strängar

Typen av det bokstavliga

Utan några förlängningar är typen av en strängbokstavlig - dvs. något mellan dubbla citat - bara en sträng, alias lista med tecken:

Prelude> :t "foo"
"foo" :: [Char]

Men när förlängningen OverloadedStrings är aktiverad, blir strängbokstäver polymorfa, liknande antalet bokstäver :

Prelude> :set -XOverloadedStrings
Prelude> :t "foo"
"foo" :: Data.String.IsString t => t

Detta gör att vi kan definiera värden för strängliknande typer utan att behöva några uttryckliga konverteringar. I huvudsak OverloadedStrings tillägget OverloadedStrings bara alla sträng som är bokstavliga i den generiska konverteringsfunktionen från fromString , så om sammanhanget kräver t.ex. den mer effektiva Text istället för String behöver du inte oroa dig själv.

Använda strängbokstäver

{-# LANGUAGE OverloadedStrings #-}

import Data.Text (Text, pack)
import Data.ByteString (ByteString, pack)


withString :: String
withString = "Hello String"

-- The following two examples are only allowed with OverloadedStrings

withText :: Text
withText = "Hello Text"      -- instead of: withText = Data.Text.pack "Hello Text"

withBS :: ByteString
withBS = "Hello ByteString"  -- instead of: withBS = Data.ByteString.pack "Hello ByteString"

Lägg märke till hur vi kunde konstruera värden på Text och ByteString på samma sätt som vi konstruerar vanliga String (eller [Char] ) värden, snarare än att använda paketfunktioner för varje typ pack att koda strängen uttryckligen.

Mer information om språkförlängningen OverloadedStrings finns i dokumentationen för tillägget .

Lista bokstäver

Med GHCs OverloadedLists- förlängning kan du konstruera listliknande datastrukturer med listans bokstavssyntax.

Detta tillåter dig att Data.Map så här:

> :set -XOverloadedLists
> import qualified Data.Map as M
> M.lookup "foo" [("foo", 1), ("bar", 2)]
Just 1

Istället för detta (notera användningen av den extra M.fromList ):

> import Data.Map as M
> M.lookup "foo" (M.fromList [("foo", 1), ("bar", 2)])
Just 1


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow