Haskell Language
Przeciążone literały
Szukaj…
Uwagi
Literały całkowite
jest liczbą bez kropki dziesiętnej
na przykład 0 , 1 , 42 , ...
jest niejawnie stosowany do fromInteger który jest częścią klasy typu Num więc rzeczywiście ma typ Num a => a - to znaczy może mieć dowolny typ, który jest instancją Num
Ułamkowe literały
jest liczbą z kropką dziesiętną
na przykład 0.0 , -0.1111 , ...
jest niejawnie stosowany do fromRational który jest częścią klasy typu Fractional więc rzeczywiście ma typ a => a - to znaczy może mieć dowolny typ, który jest instancją Fractional
Literały smyczkowe
Jeśli dodasz rozszerzenie językowe OverloadedStrings do GHC , możesz mieć to samo dla String -literals, które następnie są stosowane do fromString z klasy typu Data.String.IsString
Jest to często używane do zamiany String Text lub ByteString .
Lista literałów
Listy można definiować za pomocą składni literalnej [1, 2, 3] . W wersji GHC 7.8 i nowszych można tego również użyć do zdefiniowania innych struktur OverloadedLists rozszerzeniem OverloadedLists .
Domyślnie typ [] to:
> :t []
[] :: [t]
W przypadku OverloadedLists staje się to:
[] :: GHC.Exts.IsList l => l
Liczby całkowite
Rodzaj literału
Prelude> :t 1
1 :: Num a => a
wybór konkretnego typu z adnotacjami
Możesz określić typ, o ile typem docelowym jest Num z adnotacją :
Prelude> 1 :: Int
1
it :: Int
Prelude> 1 :: Double
1.0
it :: Double
Prelude> 1 :: Word
1
it :: Word
jeśli nie, kompilator będzie narzekał
Preludium> 1 :: Ciąg
<interactive>:
No instance for (Num String) arising from the literal `1'
In the expression: 1 :: String
In an equation for `it': it = 1 :: String
Liczba zmiennoprzecinkowa
Rodzaj literału
Prelude> :t 1.0
1.0 :: Fractional a => a
Wybór konkretnego typu z adnotacjami
Możesz określić typ za pomocą adnotacji typu . Jedynym wymaganiem jest to, że typ musi mieć instancję Fractional .
Prelude> 1.0 :: Double
1.0
it :: Double
Prelude> 1.0 :: Data.Ratio.Ratio Int
1 % 1
it :: GHC.Real.Ratio Int
jeśli nie, kompilator będzie narzekał
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
Smyczki
Rodzaj literału
Bez żadnych rozszerzeń typ literału łańcuchowego - tzn. Coś pomiędzy podwójnymi cudzysłowami - jest po prostu łańcuchem, czyli listą znaków:
Prelude> :t "foo"
"foo" :: [Char]
Jednak po włączeniu rozszerzenia OverloadedStrings literały łańcuchowe stają się polimorficzne, podobnie jak literały liczbowe :
Prelude> :set -XOverloadedStrings
Prelude> :t "foo"
"foo" :: Data.String.IsString t => t
To pozwala nam definiować wartości typów ciągów bez potrzeby jawnej konwersji. Zasadniczo rozszerzenie OverloadedStrings po prostu otacza każdy literał łańcucha w ogólnej funkcji konwersji fromString , więc jeśli kontekst wymaga np. Bardziej wydajnego Text zamiast String , nie musisz się tym martwić.
Używanie literałów łańcuchowych
{-# 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"
Zauważ, jak udało nam się skonstruować wartości Text i ByteString w taki sam sposób, w jaki konstruujemy zwykłe wartości String (lub [Char] ), zamiast używać funkcji pack każdego typu do jawnego kodowania łańcucha.
Aby uzyskać więcej informacji na temat rozszerzenia języka OverloadedStrings , zobacz dokumentację rozszerzenia .
Lista literałów
Rozszerzenie OverloadedLists w GHC umożliwia konstruowanie struktur danych podobnych do listy przy użyciu składni literału listy.
Pozwala to na Data.Map w następujący sposób:
> :set -XOverloadedLists
> import qualified Data.Map as M
> M.lookup "foo" [("foo", 1), ("bar", 2)]
Just 1
Zamiast tego (zwróć uwagę na użycie dodatkowego M.fromList ):
> import Data.Map as M
> M.lookup "foo" (M.fromList [("foo", 1), ("bar", 2)])
Just 1