Haskell Language
Letterali sovraccaricati
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