Suche…


Bemerkungen

Ganzzahlige Literale

ist eine Zahl ohne Dezimalpunkt

zum Beispiel 0 , 1 , 42 , ...

wird implizit auf fromInteger angewendet, das Teil der Num Klasse ist. fromInteger hat es tatsächlich den Typ Num a => a - das heißt, es kann einen beliebigen Typ haben, der eine Instanz von Num


Bruchliterale

ist eine Zahl mit Dezimalpunkt

zum Beispiel 0.0 , -0.1111 , ...

wird implizit auf fromRational angewendet, das Teil der Fractional fromRational ist. Es hat also tatsächlich Typ a => a - das heißt, es kann einen beliebigen Typ haben, der eine Instanz von Fractional


String Literals

Wenn Sie die Spracherweiterung OverloadedStrings zu GHC hinzufügen, können Sie dasselbe für String -Literals verwenden, auf die fromString aus der Klasse Data.String.IsString angewendet wird

Dies wird häufig verwendet, um String durch Text oder ByteString zu ersetzen.


List Literals

Listen können mit der Literal-Syntax [1, 2, 3] . Ab GHC 7.8 können mit dieser Erweiterung auch andere listeähnliche Strukturen mit der Erweiterung OverloadedLists .

Standardmäßig lautet der Typ von [] :

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

Mit OverloadedLists wird dies zu:

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

Ganzzahl

Die Art des Literal

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

Auswahl eines konkreten Typs mit Anmerkungen

Sie können den Typ angeben, solange der Zieltyp Num mit einer Anmerkung ist :

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

Wenn nicht, beschwert sich der Compiler

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

Fließende Zahl

Die Art des Literal

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

Einen konkreten Typ mit Anmerkungen auswählen

Sie können den Typ mit einer Typanmerkung angeben. Die einzige Voraussetzung ist, dass der Typ eine Fractional Instanz haben muss.

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

Wenn nicht, beschwert sich der Compiler

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

Zeichenketten

Die Art des Literal

Ohne Erweiterungen ist der Typ eines Zeichenfolgenliteral, dh etwas zwischen Anführungszeichen, nur eine Zeichenfolge, eine Liste von Zeichen:

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

Wenn jedoch die OverloadedStrings Erweiterung aktiviert ist, werden Zeichenfolgenliterale polymorph, ähnlich wie Zahlenliterale :

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

Auf diese Weise können wir Werte von String-ähnlichen Typen definieren, ohne dass explizite Konvertierungen erforderlich sind. Im Wesentlichen umhüllt die OverloadedStrings Erweiterung lediglich jedes String-Literal in der generischen fromString Konvertierungsfunktion. Wenn also der Kontext z. B. den effizienteren Text anstelle von String erfordert, müssen Sie sich nicht darum kümmern.

Verwenden von String-Literalen

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

Beachten Sie, wie wir in der Lage waren Werte zu konstruieren , Text und ByteString in der gleichen Art , wie wir gewöhnliches konstruieren String (oder [Char] ) Werte, anstatt jede Art mit pack Funktion die Zeichenfolge explizit zu codieren.

Weitere Informationen zur Spracherweiterung OverloadedStrings finden Sie in der Erweiterungsdokumentation .

List Literals

Mit der OverloadedLists- Erweiterung von GHC können Sie listenartige Datenstrukturen mit der Listenliteral-Syntax erstellen.

Dies ermöglicht es Ihnen, Data.Map wie folgt :

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

Stattdessen (beachten Sie die Verwendung der zusätzlichen M. aus der Liste ):

> 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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow