Buscar..


Observaciones

Literales enteros

es un numeral sin un punto decimal

por ejemplo 0 , 1 , 42 , ...

se aplica implícitamente a fromInteger que forma parte de la clase de tipo Num , por lo que efectivamente tiene el tipo Num a => a , es decir, puede tener cualquier tipo que sea una instancia de Num


Literales fraccionales

es un numeral con un punto decimal

por ejemplo 0.0 , -0.1111 , ...

se aplica implícitamente a fromRational que forma parte de la clase de tipo Fractional , por lo que de hecho tiene el tipo a => a , es decir, puede tener cualquier tipo que sea una instancia de Fractional


Literales de cuerda

Si agrega la extensión de lenguaje OverloadedStrings a GHC , puede tener la misma para String -literals que luego se aplican a fromString desde la clase de tipo Data.String.IsString

Esto se usa a menudo para reemplazar String con Text o ByteString .


Lista de literales

Las listas se pueden definir con la sintaxis literal [1, 2, 3] . En GHC 7.8 y más allá, esto también se puede usar para definir otras estructuras similares a listas con la extensión OverloadedLists .

Por defecto, el tipo de [] es:

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

Con OverloadedLists , esto se convierte en:

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

Numero entero

El tipo del literal.

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

Elegir un tipo concreto con anotaciones.

Puede especificar el tipo siempre que el tipo de destino sea Num con una anotación :

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

si no el compilador se quejará

Preludio> 1 :: Cuerda

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

Numeral flotante

El tipo del literal.

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

Elegir un tipo concreto con anotaciones.

Puede especificar el tipo con una anotación de tipo . El único requisito es que el tipo debe tener una instancia Fractional .

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

si no el compilador se quejará

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

Instrumentos de cuerda

El tipo del literal.

Sin ninguna extensión, el tipo de un literal de cadena, es decir, algo entre comillas dobles, es solo una cadena, también conocida como lista de caracteres:

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

Sin embargo, cuando la extensión OverloadedStrings está habilitada, los literales de cadena se convierten en polimórficos, similar a los literales de números :

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

Esto nos permite definir valores de tipos similares a cadenas sin la necesidad de conversiones explícitas. En esencia, la extensión OverloadedStrings simplemente envuelve cada literal de cadena en la función de conversión genérica fromString , por lo que si el contexto exige, por ejemplo, el Text más eficiente en lugar de la String , no necesita preocuparse por eso.

Usando cadenas literales

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

Observe cómo pudimos construir valores de Text y ByteString de la misma manera en que construimos los valores de String (o [Char] ) ordinarios, en lugar de usar cada función de pack tipos para codificar explícitamente la cadena.

Para obtener más información sobre la extensión de lenguaje OverloadedStrings , consulte la documentación de la extensión .

Lista de literales

La extensión OverloadedLists de GHC le permite construir estructuras de datos similares a listas con la sintaxis literal de listas.

Esto le permite a Data.Map como esto:

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

En lugar de esto (note el uso de M.fromList extra):

> 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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow