Ricerca…


Osservazioni

Integer Literals

è un numero senza un punto decimale

per esempio 0 , 1 , 42 , ...

viene applicato implicitamente a fromInteger che fa parte della classe di tipo Num , quindi ha in effetti il ​​tipo Num a => a - ovvero può avere qualsiasi tipo che è un'istanza di Num


Letterali frazionari

è un numero con un punto decimale

ad esempio 0.0 , -0.1111 , ...

è implicitamente applicato a fromRational che fa parte della classe di tipo Fractional quindi ha infatti tipo a => a - cioè può avere qualsiasi tipo che è un'istanza di Fractional


String letterali

Se si aggiunge l'estensione della lingua OverloadedStrings a GHC, è possibile avere lo stesso per String -literals che vengono quindi applicati a fromString dalla classe di tipo Data.String.IsString

Questo è spesso usato per sostituire String con Text o ByteString .


Elenca i letterali

Le liste possono essere definite con la sintassi letterale [1, 2, 3] . In GHC 7.8 e oltre, questo può anche essere usato per definire altre strutture di tipo listuale con l'estensione OverloadedLists .

Per impostazione predefinita, il tipo di [] è:

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

Con OverloadedLists , questo diventa:

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

Numero intero

Il tipo di letterale

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

scegliendo un tipo concreto con annotazioni

Puoi specificare il tipo finché il tipo di destinazione è Num con un'annotazione :

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

altrimenti il ​​compilatore si lamenterà

Preludio> 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

Numero galleggiante

Il tipo di letterale

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

Scelta di un tipo concreto con annotazioni

È possibile specificare il tipo con un'annotazione di tipo . L'unico requisito è che il tipo deve avere un'istanza Fractional .

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

altrimenti il ​​compilatore si lamenterà

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

stringhe

Il tipo di letterale

Senza estensioni, il tipo di stringa letterale, ad esempio qualcosa tra virgolette, è solo una stringa, ovvero un elenco di caratteri:

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

Tuttavia, quando l'estensione OverloadedStrings è abilitata, i valori letterali stringa diventano polimorfici, simili ai numeri letterali :

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

Questo ci consente di definire i valori dei tipi di stringhe senza necessità di conversioni esplicite. In sostanza, l'estensione OverloadedStrings fromString ogni stringa letterale nella funzione di conversione generica fromString , quindi se il contesto richiede ad esempio il Text più efficiente invece di String , non devi preoccuparti di te stesso.

Utilizzo di stringhe letterali

{-# 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"

Si noti come siamo stati in grado di costruire valori di Text e ByteString nello stesso modo in cui costruiamo valori ordinari di String (o [Char] ), piuttosto che utilizzare ciascuna funzione del pack tipi per codificare esplicitamente la stringa.

Per ulteriori informazioni sull'estensione di lingua OverloadedStrings , consultare la documentazione relativa all'estensione .

Elenca i letterali

L'estensione OverloadedLists di GHC consente di costruire strutture di dati di tipo elenco con la sintassi letterale di lista.

Questo ti permette di Data.Map in questo modo:

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

Invece di questo (si noti l'uso di M.fromList in più ):

> 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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow